对于一组特定数据,我们将哈希转换为JSON的通常代码是抛出错误:
the_json = JSON.generate(h)
=> Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8
在尝试查找WHICH字符导致问题时,我们注意到使用to_json不会引发错误
h.to_json
=> (very long string that looks correct)
有没有人对
有任何想法(a)如何找到有问题的角色,以便我们可以追踪它是如何发生的
(b)为什么JSON.generate比to_json更脆弱?
(c)和MOST重要的是:如何以force_encoding方式调用JSON.generate(就像许多其他ruby方法允许的那样),以便当哈希包含像“Sjöholm”这样的名称时,它会被处理而不会抛出异常。
答案 0 :(得分:2)
看起来to_json
方法不进行UTF-8验证,而JSON.generate
则执行:
"\xC3" =~ /./ # => ArgumentError: invalid byte sequence in UTF-8
JSON.generate("\xC3") # => ArgumentError: invalid byte sequence in UTF-8
"\xC3".to_json # => "\"\xC3\"" XXX: not valid UTF-8
根据我的经验,尝试正则表达式匹配字符串是确保正确的UTF-8编码的简单而可靠的方法(因此是上述示例的第一行)。