【问题标题】:Prevent JSON pretty_generate from escaping Unicode防止 JSON pretty_generate 转义 Unicode
【发布时间】:2011-09-23 20:38:48
【问题描述】:

有什么办法可以防止 Ruby 的 JSON.pretty_generate() 方法转义 Unicode 字符?

我有一个 JSON 对象如下:

my_hash = {"my_str" : "\u0423"};

运行JSON.pretty_generate(my_hash) 将返回值为\\u0423

有没有办法防止这种行为?

【问题讨论】:

  • 我不能重复这个问题。如果您使用带有 : 的哈希语法,那么您必须使用 ruby​​ 1.9,并且我检查的所有 1.9.2-3 都按照 DNNX 在他的回答中所说的正确方式执行。不过,您可能正在使用 1.9.1(我没有那个版本,因为它从来没有很好地工作过)。 1.8.7 不起作用,而且似乎没有解决方法。

标签: ruby json unicode utf-8


【解决方案1】:

在您的问题中,您有一个由 6 个 unicode 字符组成的字符串 "\""u""0""4""2""3" (my_hash = { "my_str" => '\u0423' }),而不是由 1 个 @ 组成的字符串987654330@ 字符("\u0423",注意双引号)。

根据RFC 4627,第2.5段,JSON字符串中的反斜杠字符必须被转义,这就是为什么你会从JSON.pretty_generate得到双反斜杠。

另外,还有两个字符的序列转义
一些流行角色的表示。所以,例如,一个
仅包含一个反斜线字符的字符串可能是
更简洁地表示为“\\”。

char = unescaped /
       escape (...
           %x5C /          ; \    reverse solidus U+005C

escape = %x5C              ; \

因此JSON ruby​​ gem 在内部转义该字符,无法通过参数化JSONJSON.pretty_generate 来改变此行为。

如果您对 JSON gem 实现细节感兴趣 - 它定义了内部映射散列以及 '' char 的显式映射:

module JSON
    MAP = {
        ...
        '\\'  =>  '\\\\'

我从 JSON gem gem install json_purepure ruby​​ 变体 中获取了这段代码(请注意,还有由gem install json 分发的 C 扩展变体)。

结论:如果您需要在生成 JSON 后取消转义反斜杠,您需要在应用程序逻辑中实现它,如上面的代码:

my_hash = { "my_str" => '\u0423' }
# => {"my_str"=>"\\u0423"}

json = JSON.pretty_generate(my_hash)
# => "{\n  \"my_str\": \"\\\\u0423\"\n}"

res = json.gsub "\\\\", "\\"
# => "{\n  \"my_str\": \"\\u0423\"\n}"

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    通常,哈希声明使用火箭=> 而不是冒号:。此外,从 1.9 开始,还有符号键哈希的替代语法:my_hash = {my_str: "\u0423"}。在这种情况下,:my_str 将是关键。

    无论如何,在我的电脑上JSON.pretty_generate 可以正常工作:

    irb(main):002:0> my_hash = {"my_str" => "\u0423"}
    => {"my_str"=>"У"}
    irb(main):003:0> puts JSON.pretty_generate(my_hash)
    {
      "my_str": "У"
    }
    => nil
    

    Ruby 1.9.2p290,(内置)json 1.4.2。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2012-12-22
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多