起因是这样:昨天有用户反应在网站某处输入中文会报错,查看日志发现Encoding::CompatibilityError (incompatible character encodings: UTF-8 and ASCII-8BIT)
,很显然编码出了问题。出问题的那行只是将一个 Gem 执行的结果进行了 join,当时的解决办法是 force_encoding.
今天详细尝试了下,发现此 Gem 返回的编码确实在变化,有时候是 UTF-8,有时候是 ASCII-8BIT.而我印象中从 1.9 开始 Ruby 是可以很好处理字符编码的。可是测试结果让我大跌眼镜:
a=['hello']
a.push 'kitty'.force_encoding('ASCII-8BIT')
puts a.join
=> hellokitty
a=['问题']
a.push '错误'.force_encoding('ASCII-8BIT')
puts a.join
=> incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError)
至此我认为问题出在#join 上,但 nobu 认为是"Third Party's Issue",理由是"Bugs in gems return ASCII-8BIT strings.". 可是脱离了此 Gem,执行结果仍然不同。为什么不同语言的执行结果不同却不认为是 Bug 呢?谁能详细解释下?