13

ruby 1.9 に同梱されている YAML ライブラリはエンコーディングが苦手なようです。

これが意味することは、YAML を生成するときに、任意のバイト文字列を取得し、クリーンな ASCII を出力しないバイト シーケンスをエスケープすることです。それは不自由ですが、受け入れられます。

私の問題は逆です。上記の YAML ダンプからコンテンツをロードするとき。

次の例では、UTF-8 文字列を作成してダンプします。タイプ でダンプされ!binaryます。再度ロードすると、エンコーディングは ASCII-8BIT になります。例の最後で、元の文字列とリロードされた文字列の両方を別の UTF-8 文字列と連結しようとしています。後者は . で失敗しますEncoding::CompatibilityError

require 'yaml'
s0 = "Iñtërnâtiônàlizætiøn"
y  = s0.to_yaml
s1 = YAML::load y
puts s0                 # => Iñtërnâtiônàlizætiøn
puts s0.encoding        # => UTF-8
puts s1                 # => Iñtërnâtiônàlizætiøn
puts s1.encoding        # => ASCII-8BIT
puts y                  # => --- !binary |
                        #    ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu
puts "ñårƒ" + s0        # => ñårƒIñtërnâtiônàlizætiøn
puts "ñårƒ" + s1        # => Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT

リーフ文字列を含むネストされたハッシュと配列を含む YAML ソースを扱う場合、これがどのようにすぐに問題を引き起こすかは明らかだと思います。

現在、すべてのハッシュと配列をトラバースしforce_encoding、各文字列を呼び出すコードがいくつかあります。それは、控えめに言っても、見苦しいです。

私が今探しているのYAML::loadは、入ってくる文字列を扱う必要があることを伝える方法であり、そのため、エンコーディングを UTF-8 に設定します。


理想的には、Ruby の YAML は、ダンプする文字列に適切なエンコーディングで注釈を付けるべきです。UTF-8 セーフ YAML をダンプしようとする Ya2YAML プロジェクトがあります。どこまで進んでいるのかわかりません。誰かがそれで遊んだことがあれば、どんな考えも歓迎します。

それにもかかわらず、対処するエンコード情報がないこれらのダンプがまだあります。私はそれらがすべてUTF-8であることを知っていますが。

4

4 に答える 4

3

Ruby を最新の 1.9.2 にアップグレードすることを検討してください。

そのバグは 1.9.1 で見つかりましたが、 1.9.2 では見つかりませんでした。

于 2011-04-18T09:39:46.643 に答える
2
YAML::ENGINE.yamler='psych'
'Résumé'.to_yaml # => "--- Résumé\n...\n"
于 2012-01-27T17:35:09.300 に答える
1

まず、読み込もうとしているテキストファイルはUTF-8でエンコードされている必要があります(これはYAMLファイルである必要があります)。

次に、この行をrubyファイル、ハッシュ、およびすべての先頭に追加します

# encoding: UTF-8

これは、すべての文字列のデフォルトのエンコードがUTF-8になることを意味し、YAML.dump('text')でダンプするテキスト、またはこのような文字列リテラル'もUTF-8でエンコードされる必要があることを意味します。これからはすべてうまくいくはずです。

于 2010-07-27T08:05:03.723 に答える
0

エフゲニーの答えはまだバイナリを示していますが、これは機能します(「サイク」ではなく「シック」):

YAML::ENGINE.yamler='syck'
'Résumé'.to_yaml # => "--- "R\xE9sum\xE9"

Ruby1.9を使用しています。私の目的のために、スペシャルをエスケープすることは問題ありません-通常の単語に対して !binary... を表示しないようにする必要がありました。神に感謝します.to_yamlは私にとって再び機能的です-以前は常に使用していました。実際に正気の人生をロードする方法:)

于 2013-03-16T22:28:16.620 に答える