[ruby-list:41779] Re: YAMLのマルチバイト文字列の扱いについて

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2006-01-17 10:57:48 UTC
List: ruby-list #41779
こんにちは、山本です。

>どうも、西啓一朗と申します。
>ちょっとした疑問がわいたので質問させてください。
>
>自分が使用しているレンタルサーバで使用するCGIを組んでいます。
>そのCGIでデータを保存するためにYAMLを利用しているのですが、保存したテキ
>ストファイルにちょっとした差違があったのです。
>
>レンタルサーバでの動作(FreeBSD4/csh)
>> %cat out.txt
>> さんぷる
>> %ruby -Ke -v -ryaml -e "y File.open('out.txt').read"
>> ruby 1.8.2 (2004-12-25) [i386-freebsd4]
>> --- "さんぷる"
>> %
>
>自宅(WinXP/Cygwin版ruby/bash)
>> xxx:~$ cat out.txt
>> さんぷる
>> xxx:~$ ruby -Ke -v -ryaml -e "y File.open('out.txt').read"
>> ruby 1.8.4 (2005-12-24) [i386-cygwin]
>> --- !binary |
>> pLWk86TXpOs=
>>
>> xxx:~$ 
>
>テキストファイルのエンコードはどちらもeuc-jpで同じものです。
>
>どうやらcygwin環境の方は文字列のエンコードを認識してないようなんですが、
>この差はどこで出ているのでしょうか?
>補足:YAML出力が違うだけで、中身は一致しています。

ちょうどこの辺りを調べていたところでした。

ひとつは、YAML のバイナリ判定が甘いために、マルチバイト文字が
バイナリと判定されることがあるためです。(lib/yaml/rubytypes.rb)

require "yaml"

class String
  def is_binary_data? # [ruby-list:16014]
    return true if self.include?(0)
    check = self[0, 512]
    check.size < 10 * check.count("\x00-\x07\x0b\x0e-\x1a\x1c-\x1f")
  end
end

y File.open('out.txt').read

こうすると、バイナリではなく文字列として出力されると思います。

ただ、それでも日本語じゃなく、エスケープシーケンスが出力されると思います。
これが挙動としてどうなのか、YAML の仕様的にどうなのかはまだわかっていません。

http://yaml.org/spec/current.html#id2513364 によると、YAML は UTF じゃないと
いけないらしいのですが、それにしては UTF-8 を渡してもエスケープされますし・・・

# YAML は 1.8.3 で大きな変更があり、これもそのひとつです。なお、メンテナは
# 外国の人で、why the lucky stiff と言います。



In This Thread