From: "U.Nakamura" Date: 2008-01-07T22:18:42+09:00 Subject: [ruby-dev:32971] Re: Shift_JIS variants and UTF-16 support こんにちは、なかむら(う)です。 In message "[ruby-dev:32969] Re: Shift_JIS variants and UTF-16 support" on Jan.07,2008 21:59:42, wrote: | > | > = open(write)のモードとして | > | > "utf-16"は受け付けない(InvalidArgument) | > | | > | BOM をつけて出力する手段が欲しい気がします。 | > | > "w:utf-16be" や "w:utf-16le" は当然BOMをファイル先頭に出力す | > るという想定でした。 | | RFC 2781 3.3 に“Systems labelling UTF-16BE text MUST NOT prepend a BOM | to the text.”とあるので、"w:utf-16be" や "w:utf-16le" では BOM は出力し | ないことになるかと思います。 ううむ、なるほど、RFC 2781を読むと、私が「当然」と思ったのは 実はまったく逆だったんですね... | > | > = String#encodeの引数として | > | > "UTF-16"というEncodingはないので問題ない。 | > | | > | これだけだと問題ないような気がするのですが、出力時に BOM がつけられるこ | > | とを期待する文字列の存在を考えると悩ましいところです。 | > | > Stringオブジェクトが、明示的にそういう文字列操作をやらない限 | > りはBOMを気にする必要はない(「出力」を気にするのはIOの仕事)と | > 思うのですが、何か私がポイントを見落としてるのでしょうか。 | | 先述の通りなので、UTF-16BE 文字列を "w:utf-16be" すると BOM がつかないの | でドウシヨウ、と思ったのですが、たしかにそれは IO の仕事ですね。UTF-16BE | 文字列を "w:utf-16" すると BOM 付き UTF-16BE、UTF-16LE 文字列を | "w:utf-16" すると BOM 付き UTF-16LE という感じですかね。 RFC 2781に従うとそういうことになりそうです。 でも、こうなると"UTF-16LE"な文字列をUTF-16BEに変換してBOM付き で出力したい場合ってどうすればいいんでしょうね。 IOの自動変換機構を諦めて別途変換してから出力するしかないんで しょうか。 先の、"r+"や"w+"やtruncate(0)した場合のBOMの扱いの難しさを考 えると、やっぱりBOM付き出力を組み込みで持つのはやめて、ユーザ には":utf-16be"あるいは":utf-16le"でファイルをオープンしても らってBOMは明示的にファイル先頭にZERO WIDTH NON-BREAKING SPACE を出力してもらう方がいいのかもしれません。 いやはや、難しいですねこの問題は。 それでは。 -- U.Nakamura