ccy*_*ccy 13 ruby utf-8 to-json
JSON::GeneratorError: source sequence is illegal/malformed utf-8尝试将哈希转换为json字符串时出错.我想知道这是否与编码有关,我怎么能让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 `<main>'
Run Code Online (Sandbox Code Playgroud)
Ste*_*fan 18
\xAE不是UTF-8中的有效字符,您必须使用\u00AE:
"iPhone\u00AE"
#=> "iPhone®"
Run Code Online (Sandbox Code Playgroud)
或者相应地转换它:
"iPhone\xAE".force_encoding("ISO-8859-1").encode("UTF-8")
#=> "iPhone®"
Run Code Online (Sandbox Code Playgroud)
yon*_*ytu 14
Ruby中的每个字符串都有一个底层编码.根据您的LANG和LC_ALL环境变量,交互式shell可能正在执行并以给定的编码解释您的字符串.
$ irb
1.9.3p392 :008 > __ENCODING__
=> #<Encoding:UTF-8>
Run Code Online (Sandbox Code Playgroud)
(忽略我使用Ruby 1.9而不是2.0,这些想法仍然相同).
__ENCODING__返回当前的源编码.您可能也会说UTF-8.
当您\xAE在代码中创建文字字符串并使用字节转义(the )时,Ruby会尝试根据字符串编码来解释它:
1.9.3p392 :003 > a = {"description" => "iPhone\xAE"}
=> {"description"=>"iPhone\xAE"}
1.9.3p392 :004 > a["description"].encoding
=> #<Encoding:UTF-8>
Run Code Online (Sandbox Code Playgroud)
因此,\xAE将尝试将文字字符串末尾的字节视为UTF-8流字节,但它无效.看看我尝试打印时会发生什么:
1.9.3-p392 :001 > puts "iPhone\xAE"
iPhone?
=> nil
Run Code Online (Sandbox Code Playgroud)
您需要以有效的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®\"}"
Run Code Online (Sandbox Code Playgroud)
或者,如果您的输入是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®\"}"
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
15761 次 |
| 最近记录: |