rails与编码

编码的问题遇到过很多次,却没有好好总结。在整个过程中经常遇到几种乱码发生的地方:数据库,网页,文件。作为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分别指变换后和变换前的字符代码体系。 Iconv#iconv(str) 开始转换字符串,并返回转换结果。 首先,我们在environment.rb定义两个全局变量: UTF8_TO_GBK = Iconv.new "gbk", "utf-8" GBK_TO_UTF8 = Iconv.new "utf-8", "gbk" 这样我们在下载的时候调用send_file,:filename就可以使用中文了,他需要把utf8格式换成gbk才能给系统显示,我们使用: :filename => UTF8_TO_GBK.iconv(filename) 这样就可以正常显示中文了。至于上传中文名文件,主要问题还是出现在保存到服务器的本地文件名乱码,我还没试过,但道理都是一样的吧。 今天早上又试了一下,终于可以了!主要还是确保读取和保存的本地文件名都为GBK格式 1.上传文件 filename=file.original_filename File.open("#{RAILS_ROOT}/documents/#{UTF8_TO_GBK.iconv(filename)}", "wb") 这样保证上传到服务器后的文件名都是显示中文的。 2.下载文件 filename = Document.find(params[:id]).name send_file("#{RAILS_ROOT}/documents/#{UTF8_TO_GBK.iconv(filename)}", :filename => UTF8_TO_GBK.iconv(filename)) 这样保证可以识别中文名和保存的文件名也为中文。 备注:所有的这些都是在rails1.2里边进行的,请确保网页编码为content="text/html;charset=UTF-8"。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mccxj/archive/2007/09/11/1780042.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值