改行コードを変換したいNo.06378
zoom さん 10/07/31 13:46
 
改行コードを変換するマクロが作りたいです。
改行コードが0x0A0Dとなっているものを0x0D0Aに変換する。
置換で出来そうなのですがうまくできませんでした。
サンプルなどを教えて貰えれば助かります。

※秀丸のバージョンを上げると不要な改行が増え、原因は改行コードでした。

秀丸ver8.00
XP SP3

[ ]
RE:06378 改行コードを変換したいNo.06379
IKKI さん 10/07/31 20:08
 
こんにちは。ユーザの IKKI です。

> 改行コードを変換するマクロが作りたいです。

秀丸マクロを作ることが最終目的でしょうか?
すでに存在する (大量の?) ファイルの改行コードを変換することが目的なら、エデ
ィタではなく NKF などのコマンドラインツールを使った方がいいかもしれません。

> 置換で出来そうなのですがうまくできませんでした。

私の理解では、秀丸は改行コードを文字と同列に扱うのではなく、ファイルのエン
コーディング方式の一部として扱っています。
したがって、改行コードの変換は文字の置換ではなく、ファイル入出力時のエンコー
ド指定によって行います。

// 例
saveas "abc.txt", crlf;

詳しくはマクロヘルプで saveas 文、setencode 文、charset キーワードなどを調べ
ましょう。

> 改行コードが0x0A0Dとなっているものを0x0D0Aに変換する。

「0x0A0D」はバイト並びが「0x0A 0x0D」つまり LF+CR という意味でしょうか?
(バイナリが 0x0A0D という意味だとすると、ビッグエンディアンかリトルエンディ
アンかで話が変わります)

LF+CR という並びは通常使われないと思いますが…

> ※秀丸のバージョンを上げると不要な改行が増え、原因は改行コードでした。

…既存の CR+LF なファイルを秀丸エディタ v8.x で開いたら LF+CR になってしまっ
た、という意味でしょうか?
そうだとしたら、秀丸エディタの不具合の可能性があるので、マクロ作者会議室では
なく、秀丸エディタβ版会議室
http://www.maruo.co.jp/turukame/3/indexg.html
で相談された方がいいかもしれません。

[ ]
RE:06379 改行コードを変換したいNo.06382
zoom さん 10/08/01 16:02
 
IKKIさんコメントありがとうございます。

>秀丸マクロを作ることが最終目的でしょうか?
->テキストファイルの改行コードを変換するのが目的です。

>すでに存在する (大量の?) ファイルの改行コードを変換することが目的なら、エデ
>ィタではなく NKF などのコマンドラインツールを使った方がいいかもしれません。
->ファイルは大量にはありませんし、それほど大きいものでもありません。
NKFは良く知らないですが、秀丸なら出来るかと思った次第です。

>私の理解では、秀丸は改行コードを文字と同列に扱うのではなく、ファイルのエン
>コーディング方式の一部として扱っています。
>したがって、改行コードの変換は文字の置換ではなく、ファイル入出力時のエン
>コード指定によって行います。
->改行コードはcrlf、lfcrなどが混在しており、一律crlfに変換すると無駄な改行が
出来てしまうと思ってます。

>「0x0A0D」はバイト並びが「0x0A 0x0D」つまり LF+CR という意味でしょうか?
>(バイナリが 0x0A0D という意味だとすると、ビッグエンディアンかリトルエンディ
>アンかで話が変わります)
->ファイル自体はSJISのテキストファイルです。
  ビッグエンディアン、リトルエンディアンの話は良く分かりませんが、実際のバイ
ナリを見るとバイト並びが「0x0A 0x0D」になっています

>LF+CR という並びは通常使われないと思いますが…
->通常は使われないのかもしれませんが、実際なってるので困ってるんです。

>> ※秀丸のバージョンを上げると不要な改行が増え、原因は改行コードでした。
>
>…既存の CR+LF なファイルを秀丸エディタ v8.x で開いたら LF+CR になってしま
>った、という意味でしょうか?
->違います。
  経緯はよく分かりませんが、過去の秀丸では0x0A0Dと0x0D0Aを同じ改行として表示
していてそれだと困る方がいらしたのではないでしょうか?
秀丸を修正してもらったり、機能追加をしてもらうつもりもありませんので、マクロ
でどうに対応できないかと考えました。
IKKIさんの回答で秀丸マクロでは無理だという事が分かりました。
諦めます、ありがとうございました。

[ ]
RE:06382 改行コードを変換したいNo.06383
秀丸担当 さん 10/08/02 10:43
 

以前は改行コードが混在するとき自動的に1つに統一してしまっていましたが、
最近のバージョンでは混在していても区別して解釈し、保存してもそのままの状
態で保存するようになっています。

[その他]→[ファイルタイプ別の設定]→[デザイン]→[表示]で、「改行コードを
区別して表示」をONにすると、区別して表示するようになります。

例えば以下のようなバイト列のファイルの場合、

 AAA\x0d\x0aBBB\x0a\x0dCCCc\x0d\x0aDDD\x0a\x0d

読み込むと、以下のような感じで表示されると思います。

aaa┘
bbb↓

ccc┘
ddd↓


ちょっと文字では分かりづらいですが、「┘」が曲がった矢印でCR+LFを表し、
「↓」はLFを表し、「←」はCRを表しています。


[その他]→[動作環境]で左下の「上級者向け設定」をONにして、[その他]→[動
作環境]→[ファイル]→[エンコード2]の「改行コードが混在するとき警告メッ
セージを表示」をONにしておくと、混在する場合メッセージが出て、自動的に
「改行コードを区別して表示」がONになり、混在している位置にジャンプするこ
ともできます。
ただジャンプできるのは最初の一個のみです。


マクロの場合、findspecial文を使うと任意の改行コードか、混在している位置
にジャンプさせるマクロを作ることができます。

今回の場合、
findspecial 1,1;
としてLFだけの位置にジャンプして、改行の数を減らしてから、
saveas basename, sjis, cr, lf;
とするといいかもしれません。

[ ]
RE:06383 改行コードを変換したいNo.06387
IKKI さん 10/08/03 01:44
 
こんにちは。IKKI です。

zoom さん:
v8 で追加された仕様について私がよく理解しておらず、不十分な回答をしてしまっ
たようです。すみません。
秀丸担当さんの回答をご参考になさってください。

秀丸担当さん:
フォローありがとうございます。
v8 では改行の種類を行ごとに付加情報として (文字列とは別に) 保持している、と
いう理解でよろしいでしょうか。

[ ]
RE:06387 改行コードを変換したいNo.06388
秀丸担当 さん 10/08/03 10:16
 

>v8 では改行の種類を行ごとに付加情報として (文字列とは別に) 保持している、と
>いう理解でよろしいでしょうか。

はい。文字列とは別に保持しています。
「改行コードを区別して表示」のオプション自体はV7.00から追加されていて、V7
からそうなっていたと思います。
「改行コードが混在するとき警告メッセージを表示」とfindspecial文はV8で追加
されました。

[ ]
RE:06388 改行コードを変換したいNo.06389
zoom さん 10/08/04 23:03
 
教えていただいたマクロを参考にして改行コードを変換出来ました。
ありがとうございます。

[ ]