[ruby-dev:31733] Re: string literal encoding

From: "NARUSE, Yui" <naruse@...>
Date: 2007-09-04 12:46:00 UTC
List: ruby-dev #31733
成瀬です。

Yukihiro Matsumoto wrote:
> まつもと ゆきひろです
> 
> In message "Re: [ruby-dev:31724] Re: string literal encoding"
>     on Mon, 3 Sep 2007 19:42:11 +0900, "NARUSE, Yui" <naruse@airemix.com> writes:
> |str1 = b"\x82\A0" # "あ" in Shift_JIS
> |str1.encode("Shift_JIS")
> |str2 = b"\xA4\A2" # "あ" in EUC-JP
> |str2.encode("EUC-JP")
> |p str1 == str2 # Ruby1.9=>false, JRuby=>true
> |って、なりませんか。
> 
> ややや、encode()は「encodingをEUC-JPにするように変換する」も
> のですから、JRubyでもencode("EUC-JP")の結果は"EUC-JP"ですね
> (上記の「常に」と矛盾しますが)。あるいは、そもそもJRubyではバ
> イナリ→EUC-JPには対応しないとしてエラーにするかもしれません。

バイナリ文字列にString#encodeかString#encoding=で文字コードを設定する
か、また別の方法を用いるかはともかく、Unicode以外の文字列をコードに埋め
込む方法は必要に感じるのですが、それは別の話ですからとりあえずおいておいて、

> 少なくとも上記に示されるような「EUC-JP であるとみなして
> UTF-16に変換する」という挙動はしないと思います。

えっと、確認したいのですが、

p utf16_str #=> "あいう漢字" # UTF-16 な文字列
p utf16_str.encoding #=> "UTF-16"
euc_str = utf16_str.encode("EUC-JP")
p euc_str.encoding #=> "EUC-JP"

UTF-16な文字列があったとして、それのencode("EUC-JP").encodingは常に"EUC-
JP"ですよね。RubyM17Nを実装した「Ruby」ならばRuby1.9でもJRubyでも。

また、EUC-JPのテキストを読み込んだ場合ですが、
open("eucjp.txt","r:euc-jp") do |f|
  str = f.read
  p str.encoding #=> "EUC-JP"
end
ここのstr.encodingもEUC-JPですよね。r:utf-8<euc-jpならさておき。

このようなケースを考えると、JRubyのように内部的にUTF-16を用いていたとし
ても、String#encodingがUTF-16以外を返すべきと考えられるケースが結構ある
ように感じます。

-- 
NARUSE, Yui  <naruse@airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA

In This Thread