新手问题 render :text 正常而:json 就乱码

milk · 2012年10月04日 · 最后由 milk 回复于 2012年10月07日 · 8238 次阅读

windows 7 下,RUBY 1.9.3 + Rails 3.2.8

adapter 用的是 mysql,数据库 MySQL,编码全部是 UTF8

在写代码的时候,最初发现问题是 render :text 时返回正常,而 render :json 就是乱码

最终发现问题出在从数据库读取出来的数据,使用 to_json 就会有问题

本来写了好多,后来发现一张图片更能说明问题

试试 #encoding :UTF-8

有事出去了两天…… 谢谢 sleepless,不过这个并不能解决问题,事实上我一开始就觉得应该是编码方面的问题,所以每一个文件都给加上了指定编码的#encoding : UTF-8 麻烦大家再帮我看看,我自己也再研究一下看

服务器返回给终端的 json,其中的中文用 unicode 来显示应该不影响终端正常使用的,终端会自动识别和处理的。如果你在浏览器上看到 unicode 编码不太习惯,可以安装 chrome 或 firefox 的 json 格式显示插件。

如果您坚持要看到中文,似乎网上有一个临时解决办法,供参考: http://perlove.blog.163.com/blog/static/174051112201249102620985/

本机器测试情况如下:

1.9.3p0 :002 > json = ActiveSupport::JSON
 => ActiveSupport::JSON 
.9.3p0 :004 > json.encode "你好"
 => "\"\\u4f60\\u597d\"" 
1.9.3p0 :006 > module ActiveSupport::JSON::Encoding
1.9.3p0 :007?>     class << self
1.9.3p0 :008?>         def escape(string)
1.9.3p0 :009?>             if string.respond_to?(:force_encoding)
1.9.3p0 :010?>                 string = string.encode(::Encoding::UTF_8, :undef => :replace).force_encoding(::Encoding::BINARY)
1.9.3p0 :011?>               end
1.9.3p0 :012?>             json = string.gsub(escape_regex) { |s| ESCAPED_CHARS[s] }
1.9.3p0 :013?>             json = %("#{json}")
1.9.3p0 :014?>             json.force_encoding(::Encoding::UTF_8) if json.respond_to?(:force_encoding)
1.9.3p0 :015?>             json
1.9.3p0 :016?>           end
1.9.3p0 :017?>       end
1.9.3p0 :018?>   end
 => nil 
1.9.3p0 :019 > json.encode "你好"
 => "\"你好\"" 

@tech_blogbin 谢谢给我这么详细的解释,但是我现在的问题并非是看到 unicode 码而感觉是乱码,而是它给出的 unicode 码确实是乱码,比如我上面的“系统配置”四个中文字,render :json 后给出的 unicode 码是"\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd",这明显是不对的

喔,大概明白您的意思。上面的建议不一定有效,但你也不妨试试看。 另外,您将要要渲染的数据是从 mysql 数据库提供的么?用的 adapter 是那个?mysql 或者 mysql2 ?

@tech_blogbin 是的,数据是从 MYSQL 提取的,adapter 因为是 WINDOWS,所以暂时也只能用 mysql 了,都设置成了 utf8,取出来的数据,也是正常的,如图

或许和 adapter 为 mysql 有关?

Everyone running on Ruby 1.9.x and using MySQL, should use the mysql2 gem. It forces the use of UTF-8 and converts to/from UTF-8 automatically when needed.

http://stackoverflow.com/questions/3986675/rails-json-response-encoding

@tech_blogbin 真的是百思不得其解,或许真的是 adapter 的关系吧,明天找台 LINUX 来试试看

json.encode(foo).to_s试试

@ywjno 无论是 json.encode(bar).to_s 还是 json.encode(bar.to_s) 都一样 刚下好了 linux,装上看看

需要 登录 后方可回复, 如果你还没有账号请 注册新账号