windows 7 下,RUBY 1.9.3 + Rails 3.2.8
adapter 用的是 mysql,数据库 MySQL,编码全部是 UTF8
在写代码的时候,最初发现问题是 render :text 时返回正常,而 render :json 就是乱码
最终发现问题出在从数据库读取出来的数据,使用 to_json 就会有问题
本来写了好多,后来发现一张图片更能说明问题
有事出去了两天…… 谢谢 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