RoR中文问题tips

从这里整理的: http://www.railscn.com/about45-0-asc-15.html

结合RubyOnRails官方Wiki上的一些介绍和自己实践写的。这个方法就是在使用rails的内置的长度校验的时候要考虑到中文一般占用3个字符。

Ruby本身不支持UTF-8,但是我们可以使用一些办法使用8bit的字符来储存UTF-8编码后的字符串.但是这会导致一些字符串函数出现问题,可以通过使用jcode包里的函数来替换原来的字符串函数,如length可以用jlength替换。
1、首先,我们需要在public/dispatch.cgi文件的#!/path/to/ruby后面加上-Ku -rjcode
2、然后,需要使用一个before_filter来输出http头,表示使用utf-8字符集。
class ApplicationController < ActionController::Base
before_filter :set_charset

def set_charset
@headers["Content-Type"] = "text/html; charset=utf-8"
end
end
3、接着,如果要在Safari浏览器里使用rails的ajax帮助函数,则必须加入以下代码
class ApplicationController < ActionController::Base
after_filter :fix_unicode_for_safari

# automatically and transparently fiixes utf-8 bug
# with Safari when using xmlhttp
def fix_unicode_for_safari
if @headers["Content-Type"] == "text/html; charset=utf-8" and
@request.env['HTTP_USER_AGENT'].to_s.include? 'AppleWebKit' then
@response.body = @response.body.gsub(/([^\x00-\xa0])/u) { |s| "&#x%x;" % $1.unpack('U')[0] }
end
end

4、另外,可能需要调整数据库的设置能够存储utf-8字符串。

5、必须把rb源文件以及rhtml等模版文件都保存为utf-8格式。
这样你就可以直接在rb源文件里输入中文了。
=======================================================
这个方法要求从头到尾都是UTF-8.
首先、网页需要UTF-8编码。
其次,rhtml,rxml,rb文件都需要保存为utf-8 unless 你不用中文字符串。
最后,数据库这一块到似乎不是很强调是不是支持UTF-8。这个我没测试过其他情况。

如果仅仅是处理表单中的中文,Rails本身就没问题的,这个方法主要是能在ruby程序代码里使用中文字符串。
=======================================================
我按照这些方法都作了,mysql 用的Utf8编码,为什么我输入吃这个字是乱码呢?
我解决了,其实最主要是mysql connection 要utf8
我重新设置了一下mysql,就一切ok了
=======================================================
编码的问题确实很烦的。
最近就碰到一个比较妖怪的问题,醒来也一起帮我调试了半天。

一套程序,在我的开发机器上,Rails 0.13+WebRick+mySql的情况下,在FireFox和IE里AJAX部分都能够正常运行,但是发布到Linux服务器上,使用Apache+CGI的情况下,在IE下却出现任何Ajax的请求都能发送,而响应内容去无法update到某个div,一直报"Javascript系统错误"。这个问题我们想了很多原因,一一尝试后都一无所获。

后来觉得是编码的问题,于是把所有的rhtml文件都转换为UTF-8编码,发现仍然是老问题。比较郁闷的时候,看醒来用httplook抓的Http Header,发现怎么不是utf-8,然后又去查看那几个ajax请求的action,发现在IE里他们都是GB2312,突然想起来服务器的Apache默认charset是GB2312,而我忘记在application.rb里强制设置charset为utf-8了,于是那些有layout的action都按照layout里判断出charset为utf-8,而ajax请求的action都是不使用layout的,于是charset就变成了Apache默认的GB2312。而IE似乎是不允许把两种编码的内容混合在一起的,于是就出现错误了。
===========================================================
听说需要在config/environment.rb里加上一行:
$KCODE = ‘utf8′

估计跟楼主的
“1、首先,我们需要在public/dispatch.cgi文件的#!/path/to/ruby后面加上-Ku -rjcode ”
差不多吧?

另外,最好在database.yml里加上 encoding: utf8
===========================================================


Leave a Reply

*