runex utf-16No.05402
三輪の牛 さん 10/03/18 23:02
 
runex でutf-16を指定したとき、
1)外部プログラムの出力はBOM無しでないといけないのでしょうか
2)外部プログラムが返した結果に対して何か変換を掛けていますか?

 ファイルの内容が
test↓
 のとき、これをそのまま出力するプログラムを通すと
 バイナリで次のようになりました。

74,65,73,74,0D,0A,0D,00,0A,00,

 プログラム単体では正常動作します。

[ ]
RE:05402 runex utf-16No.05408
秀丸担当 さん 10/03/19 10:15
 

>runex でutf-16を指定したとき、
>1)外部プログラムの出力はBOM無しでないといけないのでしょうか

試してみたところ、BOMの解釈はしていなくて、そのまま出力されていました。

>2)外部プログラムが返した結果に対して何か変換を掛けていますか?

「>con」相当のことをしている場合、貼り付けに近い処理をしています。
貼り付けでは、改行コードが混在している場合、都合のいいように解釈されてし
まう可能性があるかもしれないです。
下記サンプルではこちらで試して限りでは問題は見られませんでした。
「>filename.xxx」相当のことをしている場合は、そのままファイルに出力され
ます。

> ファイルの内容が
>test↓
> のとき、これをそのまま出力するプログラムを通すと
> バイナリで次のようになりました。
>
>74,65,73,74,0D,0A,0D,00,0A,00,
>
> プログラム単体では正常動作します。

元のファイル内容がUTF-16ではなくShift-JISなどのASCIIテキストなのだと思い
ますが、これをUTF-16として解釈すると、「整瑳・」というような文字化けした
テキストになると思います。そのことを言われているとしたら、正しいかもしれ
ないです。

最後の 0D, 00, 0A 00 は UTF-16の改行コードだと思います。
これが勝手に入ってしまうということでしたら、何かバグがあるのかもしれない
です。
サンプルプログラムで、

  //"test↓"(↓はCR+LF)
  WriteFile( hstdout, "\x74\x65\x73\x74\x0D\x0A", 6, &cb, NULL );

というようなプログラムを作って、マクロは以下のようなマクロ

  runex "test.exe"
        , 1, 0, ""
        , 1, ""  //stdout
        , 0, "" , 0, "", 1, 1
        , 2      //unicode
        ;

で試してみて、これをUTF-16で保存した後の結果はバイナリで以下のようになり
ました。

  74,65,73,74,0D,0A

という結果になり、 0D, 00, 0A 00 は入りませんでした。
もし出力結果に対して手動で改行を入れられているとしたら、言われている結果
になるかもしれません。

お手数ですが、具体的なマクロやファイル内容,操作手順などを教えていただけ
ると何かわかるかもしれないです。

[ ]
RE:05408 runex utf-16No.05409
秀丸担当 さん 10/03/19 10:18
 

>>runex でutf-16を指定したとき、
>>1)外部プログラムの出力はBOM無しでないといけないのでしょうか
>
>試してみたところ、BOMの解釈はしていなくて、そのまま出力されていました。

こちらの説明が不足していました。
すみません。
現状では、BOMなしでないといけないということになってしまいます。
出力結果に対して余計な変換をしないほうがいいという意見もあり、自動的に除
去したくない場合もあるかもしれないので、現状ではこういう仕様ということで
お願いしたいところです。

[ ]
RE:05408 runex utf-16No.05423
三輪の牛 さん 10/03/19 23:26
 
 お試しくださりありがとうございます。
 runexのエンコード引数なのですがこの意味を私は誤解していたのかもわかりませ
ん。私の解釈は、Unicodeを指定したときに標準入力として編集中のテキストの内容
を取り込んだときUTF-16に変換してくれるものだと思っていました。そして標準出力
についてもUTF-16と解釈して再びテキストに取り込んでくれるものと解釈していまし
た。
 外部プログラムで標準入力をShift-JISとして取り込むと正しくUTF-16のファイル
ができました。
 下のコマンドで-ieが入力エンコーディング、-oeが出力エンコーディングです。
runex "HTMLFormat.exe -ie=shift-jis -oe=utf-16", 1, 4, "", 2, directory + "\
\test3.txt", 7, "", 0, "", 0, 0, 1;

 最終的にやりたいことは編集中のテキストにある種のフォーマット処理を行うこと
で、それを外部プログラムで行いたいのです。できれば情報の欠落の可能性を下げる
ためUnicodeで処理したいのですが。

runexでUnicodeを指定するとどんなことが起こるのが仕様になりますか?

 BOMを残すのが仕様とのことなのですが、それですと外部プログラムによっては標
準出力をテキストに取り込んだときBOMがゴミとしてはいることにならないでしょう
か。外部プログラム側で標準出力にはBOMを出力しないのが流儀なのか取り込む側でB
OMを削るのが流儀なのか私はわかっていないのですが。



[ ]
RE:05423 runex utf-16No.05424
三輪の牛 さん 10/03/20 00:08
 
 済みません、私が引数の指定を間違っていました。
 以下のコマンドで意図したとおりの動きをしていました。

runex "HTMLFormat.exe -ie=utf-16 -oe=utf-16", 1, 4, "", 7, "", 7, "", 0, "",
 0, 0, 2;

 標準出力のBOMをテキストに取り込むときはBOMはきっちりと取ってくれていました。
 ご迷惑をおかけしました。



[ ]
RE:05424 runex utf-16No.05426
三輪の牛 さん 10/03/20 14:30
 
BOMの件はアウトプット枠に出力した場合は取ってくれていましたが
選択範囲を置き換えるようにした場合や新規にした場合は先頭にBOMが入ってきました。

[ ]
RE:05426 runex utf-16No.05430
秀丸担当 さん 10/03/23 12:15
 

>runex "HTMLFormat.exe -ie=utf-16 -oe=utf-16", 1, 4, "", 7, "", 7,
>"", 0, "", 0, 0, 2;

runexでUnicodeを指定したときの仕様は、こちらの通り、標準入力についても
Unicodeとして渡されるということでお願いします。


> BOMを残すのが仕様とのことなのですが、それですと外部プログラムによっ
>ては標準出力をテキストに取り込んだときBOMがゴミとしてはいることになら
>ないでしょうか。外部プログラム側で標準出力にはBOMを出力しないのが流儀
>なのか取り込む側でBOMを削るのが流儀なのか私はわかっていないのですが。

BOMを残すと、ゴミが入ることになると思います。
標準出力でBOMを付けるべきかどうかはどちらが流儀なのかは自分でもよくわか
らないですが、たとえ制御コードのような情報であっても秀丸エディタで勝手な
ことをしないでほしいという意見があるので、できればそのままとさせていただ
きたいところです。

標準出力の一般的なコマンドプロンプトでの使い方として、「>output.txt」と
してファイルに出力することができることを考えると、BOMを付ける流儀があっ
てもよさそうに思えます。

test.exe >output.txt

一方で「>>output.txt」とすると、ファイルに書き足すことができるので、標準
出力にはBOMは付けるべきではないと考えることもできると思います。

test.exe >>output.txt

ちなみに 「cmd.exe /u /c dir >output.txt」 ではBOMは付いていませんでした。
あと「copy a.txt+b.txt c.txt」ではBOMは除去されました。

これらをまとめると、BOMはファイルの先頭にだけあるもので、標準入出力はフ
ァイルではないのでBOMは無いほうがいいと考えるのが妥当なところではないか
と思います。


>BOMの件はアウトプット枠に出力した場合は取ってくれていましたが
>選択範囲を置き換えるようにした場合や新規にした場合は先頭にBOMが入って
>きました。

アウトプット枠はWindows標準のエディットコントロールを使っているため、BOM
に相当する文字が見えていないだけのようで、実際にはアウトプット枠にも出力
されているようです。
コピーして秀丸エディタ本体の編集エリアに貼り付けたらBOMが貼り付けられま
した。

ちなみに、こういったシーンでBOMの存在を知ることができるのも、貼り付けで
BOMを除去していないからこそ、だと思います。
もし貼り付けでBOMを解釈して除去していたら、なんだかよくわからないことに
なっているのではないかと思います。

[ ]
RE:05430 runex utf-16No.05451
三輪の牛 さん 10/03/24 10:55
 
 外部プログラムで標準出力にはBOMを出力しないようにしました。
 runexのおかげで、範囲選択した部分を外部プログラムを呼び出してHTML整形でき
るようになりました。最終的には以下のようなマクロでしっくりした操作性で使えて
います。

disabledraw;
begingroupundo;
runex "HTMLFormat.exe -ie=utf-16 -oe=utf-16", 1, 5, "", 6, "", 0, "", 0, "",
 0, 0, 2;
endgroupundo;


[ ]