Ruby to_json问题错误“非法/格式错误的utf-8”

我收到错误JSON::GeneratorError: source sequence is illegal/malformed utf-8当尝试将哈希转换为json字符串时, JSON::GeneratorError: source sequence is illegal/malformed utf-8 。 我想知道这是否与编码有关,我怎么能让to_json只是对待\ xAE?

 $ 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 `' 

\xAE不是UTF-8中的有效字符,您必须使用\u00AE

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

或者相应地转换它:

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

Ruby中的每个字符串都有一个底层编码。 根据您的LANGLC_ALL环境变量,交互式shell可能正在执行并解释给定编码中的字符串。

 $ irb 1.9.3p392 :008 > __ENCODING__ => # 

(忽略我使用Ruby 1.9而不是2.0,这些想法仍然相同)。

__ENCODING__返回当前的源编码。 你的可能也会说UTF-8。

当您在代码中创建文字字符串并使用字节转义\xAE\xAE )时,Ruby会尝试根据字符串编码来解释它:

 1.9.3p392 :003 > a = {"description" => "iPhone\xAE"} => {"description"=>"iPhone\xAE"} 1.9.3p392 :004 > a["description"].encoding => # 

因此,文本字符串末尾的字节\xAE将被视为UTF-8流字节,但它无效。 看看我尝试打印时会发生什么:

 1.9.3-p392 :001 > puts "iPhone\xAE" iPhone  => nil 

您需要以有效的UTF-8编码提供注册的标记字符(使用真实字符,或提供两个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)并且您确实知道它,您可以告诉Ruby将您的字符串解释为另一种编码:

 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®\"}" 

希望能帮助到你。