ルビーのすべての文字列は、AがありますアンダーレイエンコーディングLANG
とLC_ALL
環境変数に応じて、対話型シェルが実行され、指定されたエンコーディングで文字列を解釈している可能性があります。
$ irb
1.9.3p392 :008 > __ENCODING__
=> #<Encoding:UTF-8>
(私が2.0の代わりにRuby 1.9を使用しているのを無視しても、アイデアは同じです)。
__ENCODING__
は、現在のソースコードを返します。あなたはおそらくUTF-8とも言います。あなたのコード内のリテラル文字列と使用バイトエスケープ(\xAE
)を作成すると、Rubyは、文字列エンコーディングに従ってそれを解釈しようとしている
:
1.9.3p392 :003 > a = {"description" => "iPhone\xAE"}
=> {"description"=>"iPhone\xAE"}
1.9.3p392 :004 > a["description"].encoding
=> #<Encoding:UTF-8>
ので、バイト\xAE
あなたの終わりにリテラル文字列はUTF-8ストリームバイトとして扱われますが、無効です。私はそれを印刷しようとすると、何が起こるかを参照してください:
1.9.3-p392 :001 > puts "iPhone\xAE"
iPhone�
=> nil
次のいずれかの有効なUTF-8エンコーディングで登録マークの文字を提供する必要があります(実際の文字を使用して、または2つのUTF-8バイトを提供するいずれか):
1.9.3-p392 :002 > a = {"description1" => "iPhone®", "description2" => "iPhone\xc2\xae"}
=> {"description1"=>"iPhone®", "description2"=>"iPhone®"}
1.9.3-p392 :005 > a.to_json
=> "{\"description1\":\"iPhone®\",\"description2\":\"iPhone®\"}"
それとも、あなたの入力はISO-8859-1(ラテン1)であり、あなたは確かにそれを知っている場合は、別のエンコーディングとして、あなたの文字列を解釈するためにルビーを伝えることができます。
1.9.3-p392 :006 > a = {"description1" => "iPhone\xAE".force_encoding('ISO-8859-1') }
=> {"description1"=>"iPhone\xAE"}
1.9.3-p392 :007 > a.to_json
=> "{\"description1\":\"iPhone®\"}"
それを願っています助けてください。
「そのまま扱う」という意味の場合は、 {"description" => "iPhone \\ xAE"} to_json => "\" description \ ": \ "iPhone \\\\ xAE \"} " –