最近试着用rails做一个小项目,在处理中文时遇到了一些麻烦,于是在网上google来baidu去,再加上自己的一些实践,总算是解决了。
首先介绍一下我的开发平台: rails 2.0.0.1, oracle 9i, netbeans 6 , windows 2003。应该是具有普遍代表性的。下面我先绍一下遇到的问题及处理原理,最后再给出实际的配置代码。
其中遇到的中文处理问题主要有以下三种:
1. rhtml显示乱码:
写在页面中的中文如 <h>首页</h>在浏览器中显示为乱码。
这个其实很好解决,只要设定浏览器的编码方式与rhtml的存储格式一致就行了,比如我的rhtml是按照utf-8来保存的,那么在浏览器里的编码也要选择utf-8。原理就不多说了,大家应该都明白。
2.数据库中的内容在浏览器中显示为乱码,或输入的中文存进数据库变成乱码
这个问题比较有意思,因为这只发生在浏览器上,在pl/sql或toad上没这个问题,一切正常。
因此,这个问题处理起来要复杂一些,和数据库的服务器的字符集设置,还有数据库客户端设置都有关系,与rhtml的编码设置也有关。因为各种数据库的设置并不一样,所以在下面我只能给出oracle的解决方法。
oracle本身对字符的处理取决于两个方面:服务器端字符集配置和客户端字符集配置。简单来说就是下面两种情况:
- 服务器端和客户端配置的字符集一致
此时在把数据存入表中或把数据从表中取出时,oracle对字符不做任何转换,你输入的是什么就是什么,相当于二进制存储,此时oracle不会了解你用的是什么编码,只是原样按照二进制的01码存入或取出。
- 服务器端和客户端不一致
此时oracle会对存取操作进行转换,在取出时,由服务器字符集转为客户端字符编码,存入时,由客户端编码转入服务器编码。
根据以上的原理,我们似乎可以得出这样一个结论,如果oracle服务器端的字符集和客户端的字符都支持中文字符,不管一致不一致,oracle都应该没有乱码问题(中文版的oralce安装时编码默认一般是gbk或utf-8),因为它会自动转换编码。的确如此,其实乱码的产生完全是因为应用程序(pl/sql, toad,web)的错。下面根据我的实际环境来说一下错误是怎么产生的:
服务器字符集:ZHS16GBK
客户端字符集:ZHS16GBK
这两个字符集的配置是一样的,因此不存在编码转换的问题。那为什么网页上显示却是乱码呢,这是因为在rhtml中我把编码设置为utf-8,这样浏览器就认为所有传给它的字符应该是utf-8编码的,而实际上我们从数据库中取出的是以 gbk编码的字符,当浏览器以utf-8的编码方式来解释gbk的字符时,当然会产生乱码。(那为什么pl/sql devloper显示是正确的呢?呵呵,告诉你一个秘密,windows 对于非unicode程序,默认的字符集是cp936,而cp936呢,其实就等于gbk)。
知道了原因,那解决起来就好办了,立刻动手,把oralce客户端的编码改为utf-8,网页就一切正常了...但是,这样一来,pl/sql却没法看了。所以我们应该让oralce客户端只在rails中使用utf-8,而其他程序中还是用gbk(方法在后面给出)。
如果你想问,为什么一定要用utf-8, 而不用gbk,那么我想你应该看看下面一个问题。
3.当rails中使用GBK保存文件时,中文处理会出错
如果你把文件存为gbk格式,而在文件中又写了下面一句的话,我保证你将无法看到精美的网页。
<%= "管理" %>
这是因为rails(ruby)对字符串的处理有问题,使用的字符集可能是基于日文的,所以对有些中文字会无法解析。
解决的方法就是修改rails的默认编码。
4. Netbeans的输出(output)窗口显示中文乱码
这是因为你的文件用了utf-8格式,改用gbk就好了。目前还不知道如何能让utf-8格式在output窗口中正常显示。
----------------------------------------------------------------------------------------------------
下面是具体的配置部分,分为utf-8和gbk两种情况下的配置,请注意oracle部分,我的环境中服务器端和客户端原本都是gbk字符集,所以如果你的配置和我的不同,请根据实际情况修改。
UTF-8配置:
第一步要在 project properties 窗口,将 rais >> encoding 选项设为utf-8
然后在下列文件中添加代码:
in enviroment.rb:
#处理oracle字符编码问题
ENV['NLS_LANG'] = "AMERICAN_AMERICA.UTF8"
in appliction.rb:
before_filter :configure_charsets
def configure_charsets
response.headers["Content-Type"] = "text/html; charset=UTF-8"
end
in controller 或 layout 文件:
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
GBK配置:
第一步要在 project properties 窗口,将 rais >> encoding 选项设为GBK
然后在下列文件中添加代码:
in enviroment.rb:
#设置rails默认编码
$KCODE="GBK"
ActionController::Base.default_charset=( "GBK ")
in appliction.rb:
before_filter :configure_charsets
def configure_charsets
response.headers["Content-Type"] = "text/html; charset=GBK
end
in controller 或 layout 文件:
<meta http-equiv="content-type" content="text/html;charset=GBK" />