1

UTF-8 ページからスクレイピングされたフィールドがあります。

"O’Reilly"

そしてymlファイルに保存されます:

:name: "O\xE2\x80\x99Reilly"

(xE2x80x99 は、このアポストロフィの正しい UTF-8 表現です)

ただし、値をハッシュにロードし、utf-8 としてタグ付けされたページに渡すと、次のようになります。

OâReilly

UTF-16 で x00E2 としてエンコードされている文字 â を調べたところ、文字列を貼り付けたときに、文字 x80 と x89 は表示されませんでしたが、â の後に存在していました。これは、アプリが 1 つの UTF-8 ではなく 3 つの UTF-16 文字を出力していることを意味すると思います。

Rails に 3 バイトの UTF-8 コードを 1 文字として解釈させるにはどうすればよいですか?

4

3 に答える 3

2

最終的に、これはsyckファイル(外部スクリプトによって生成された)をpsych(rails内)でロードすることによって引き起こされました。syckを使用してロードすると、問題が解決しました。

#in ruby environment
puts YAML::ENGINE.yamler => syck

#in rails
puts YAML::ENGINE.yamler => psych

#in webapp
YAML::ENGINE.yamler = 'syck'
a = YAML::load(file_saved_with_syck)
a[index][:name] => "O’Reilly"
YAML::ENGINE.yamler = 'psych'
于 2011-07-08T21:18:42.073 に答える
2

ルビ文字列は、文字ではなくバイトのシーケンスです。

$ irb
>> "O\xE2\x80\x99Reilly"
=> "O\342\200\231Reilly"

あなたの文字列は10バイトのシーケンスですが、8文字です(ご存じのとおり)。HTML で正しい文字列を出力していることを確認する最も安全な方法 (Rails について言及したので、HTML が必要だと思います) は、印刷できない文字を HTML エンティティに変換することです。あなたの場合には

O’Reilly

これには多少の手間がかかりますが、HTML を UTF-8 で送信しても、エンドユーザーがブラウザをオーバーライドして Latin-1 またはその他のばかげた制限付き文字セットを表示するように設定している場合に役立ちます。

于 2011-07-07T20:03:59.027 に答える
1

これは、アプリが 1 つの UTF-8 ではなく 3 つの UTF-16 文字を出力していることを意味すると思います。

これは実際には UTF-16 ではなく、Web ではめったに使用されません (そして、そこで大部分が壊れます)。アプリ3 つの Unicode 文字 (2 つの非表示の制御コードを含む) を出力していますが、これは UTF-16 エンコーディングと同じではありません。

問題は、YAML ファイルが ISO-8859-1 でエンコードされているかのように読み込まれるため、\xE2バイトが文字 U+00E2 などにマップされることです。Ruby 1.9 を使用していて、YAML が UTF-8 ではなく ASCII-8BIT エンコーディングに関連付けられたバイト文字列に解析されているため、文字列は後で一連のトランスコーディング (マングリング) を受けることになると思います。

この場合、文字列を本来あるべき状態に戻すか、文字列を UTF-8 に戻すようにforce_encoding設定する必要があります。default_internalこれはちょっと面倒。

于 2011-07-07T23:52:50.887 に答える