作者: Zazel
日時: 2009/5/15(22:40)
Zazelです。

=== dune <FZH01112@...> さんが書かれた
=== <200905151009.n4FA9hKB003629@...> にて

> ActivePerl で UTF-32BE 出力する際、出力を binmode にしないと
> 0x0A が 0x00 0x00 0x00 0x0A 0x0D に変換されてしまうのですが、
> これは Perl のバグになるのでしょうか、それとも Windows ユーザ
> が気をつけてコーディングすべき問題? Windows 固有の問題だと
> 思うので、仕様の穴をついてしまった・そこまで考えて perl 作って
> ねーよって感じでしょうか。

最初に確認ですが、「0x00 0x00 0x00 0x0D 0x0A と変換されてしまう」の
間違いでいいですか? (0D と 0A が逆)
間違いでなければ、私の手には負えません。

と前置きして、これは予想通りWindows 固有の問題です。0A は改行コード
なので、PerlはWindows 用の改行コード 0D 0A に置き換えてくれます。
それを抑制するのがbinmode の存在理由そのものでありPerlIO では :raw
になります。

よって今回の場合は open(FOUT, ">:raw:encoding(UTF-32BE)", $fout) と
書けば所望の動作となります。

> test1.pl のほうがスマートではあるけど、
> open(FOUT, ">:encoding(UTF-32BE):raw", $fout)
> とか書けないみたいだし、残念です。

これでいけない理由は、PerlIO のドキュメントを読んで理解することを
お薦めします。

    %%%%

ここからは余談。

これってメモ帳が吐くようなUTF-16を出力する時にも気をつけるべき問題
なんですね。 :raw:encoding(UTF-16LE):crlf:via(File::BOM) かな。

(* SEKI Masatoshi  /  zazel.ts@..."cx"           *)
(*  Would you hold my hand? Softly, let's linger. *)