编码的问题遇到过很多次,却没有好好总结。在整个过程中经常遇到几种乱码发生的地方:数据库,网页,文件。作为rails基础的ruby语言,尽管支持Unicode编码的字符串,但是他的类库却不真正支持Unicode。这就是说一个中文,Ruby是不知道在unicode编码格式下的两个字节其实是表示一个字符的。
详细请看:AWDWR一书252页
另外,什么是乱码?按照我们的直观感觉,就是说根本不知里边说是什么意思。其实就是某段字符串的内在编码格式和其显示的编码格式不兼容所导致的。
例如数据库mysql,使用utf-8来存储中文的时候,我们在SQLyog Enterprise却看到一堆乱码,这是因为我们放进去的中文给换成了utf8,而取出来的时候仍然按照utf8显示,所以就是乱码了,这个时候我们使用命令:
set names 'gbk';
这样让他从utf8转为gbk显示出来,这样我们就可以看到中文了。
例如浏览器,我们设置使用utf8链接数据库,同时必须要保证rhtml和http头里边的Content-type皆为utf8才能让页面正常显示。在rails1.2里边,默认的content-type已经是utf8编码的了。
例如文件,对于我们中文用户来说,系统默认的编码是gbk,就是说utf8的文件名让我们看起来就是乱码一堆,这在文件下载上传时的文件名乱码比较有体会。所以我们要对这些东西进行编码转换。
总体来说,ruby对unicode支持不够,让开发很郁闷,所以要借助其他的工具。一般来说,我们接触到的编码只有utf8和gbk,只要保证数据库,连接方式,源代码,页面文件全都用utf8格式的话,就会工作得很好,省去很多烦恼。但是最近做文件下载的时候,下载的文件名还是有编码的问题。我们借助ruby的附加库Iconv,使用起来也很简单:
Iconv.new(to, from)
这是一个类方法,生成并返回从from到to的新的转换器。to和from分别指变换后和变换前的字符代码体系。
开始转换字符串,并返回转换结果。
首先,我们在environment.rb定义两个全局变量:
UTF8_TO_GBK = Iconv.new "gbk", "utf-8"
GBK_TO_UTF8

