我只是尝试加载UTF-8 json文件并将其返回。它在mac上工作正常,但是当我将它部署到CentOS时它会失败。
我该如何解决?
加载UTF-8文件。
[ec2-user@ip-XXX-XXX-XXX-XXX vfs]$ file data/E03124/data.json
data/E03124/data.json: UTF-8 Unicode text, with very long lines, with no line terminators
错误消息
Caught Encoding::CompatibilityError at '"{\"資産の部\":{': incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string)
回溯
json (1.8.1) lib/json/pure/parser.rb:242:in `rescue in parse_string'
json (1.8.1) lib/json/pure/parser.rb:213:in `parse_string'
json (1.8.1) lib/json/pure/parser.rb:257:in `parse_value'
json (1.8.1) lib/json/pure/parser.rb:121:in `parse'
json (1.8.1) lib/json/common.rb:155:in `parse'
json (1.8.1) lib/json/common.rb:334:in `load'
app/controllers/statements_controller.rb:13:in `block in getData'
app/controllers/statements_controller.rb:12:in `open'
app/controllers/statements_controller.rb:12:in `getData'
Rails代码
def getData
json_data = open("data/#{params[:code]}/data.json") do |io|
JSON.load(io)
end
render :json => json_data
end
Ruby版本是2.0.0。
Rails版本是4.1.4。
答案 0 :(得分:2)
问题是json/pure
解析器。匹配字符串的正则表达式使用n
选项,意味着模式采用ASCII-8BIT
编码。来自ruby regex docs:
当regexp共享编码时,可以匹配字符串,或者regexp的编码是US-ASCII,字符串的编码是ASCII兼容的。
如果尝试在不兼容的编码之间匹配,则会引发Encoding :: CompatibilityError异常。
在github repository上打开一个问题。在此期间尝试不同的解析器。我热烈建议使用yajl
或oj
multi_json 。
如果你无法在你的盒子上构建ruby C扩展,那么这是一个不同的问题。当扩展不能正确构建(afaik)时,JSON gem使用纯变体。