2013-08-05 43 views
8

ハッシュをjson文字列に変換しようとしたときにエラーJSON::GeneratorError: source sequence is illegal/malformed utf-8が発生しました。私はこれがエンコーディングと何か関係があるのだろうかと思っていますが、to_jsonをそのまま\ xAEとして扱うことができますか?Ruby to_jsonのエラーで「不正な/不正な形式のutf-8」

$ irb 
2.0.0-p247 :001 > require 'json' 
=> true 
2.0.0-p247 :002 > a = {"description"=> "iPhone\xAE"} 
=> {"description"=>"iPhone\xAE"} 
2.0.0-p247 :003 > a.to_json 
JSON::GeneratorError: source sequence is illegal/malformed utf-8 
    from (irb):3:in `to_json' 
    from (irb):3 
    from /Users/cchen21/.rvm/rubies/ruby-2.0.0-p247/bin/irb:16:in `<main>' 
+0

「そのまま扱う」という意味の場合は、 {"description" => "iPhone \\ xAE"} to_json => "\" description \ ": \ "iPhone \\\\ xAE \"} " –

答えて

13

\xAEあなたの代わりに\u00AEを使用する必要があり、UTF-8で有効な文字ではありません。

"iPhone\u00AE" 
#=> "iPhone®" 

またはそれに応じて変換します

"iPhone\xAE".force_encoding("ISO-8859-1").encode("UTF-8") 
#=> "iPhone®" 
13

ルビーのすべての文字列は、AがありますアンダーレイエンコーディングLANGLC_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®\"}" 

それを願っています助けてください。

+0

ご説明いただきありがとうございます。 \ xAEはUTF-8でエンコードされていませんでしたが、Javascriptエスケープ(http://www.charbase.com/00ae-unicode-registered-sign)を使用していました。 – ccy