关于ror使用中文UTF8编码配合MySQL数据库.
ror的MVC开发流程相当的简洁,对比用过来的PHP和JAVA我的感觉确实是很优秀的.
已往开发过的PHP和JAVA开发开发无线WEB/WAP应用中基本上全部使用UTF8在MySQL中编码存储,从数据库数据到页面,源代码全部统一使用UTF8编码.
对于数据库具体来说,在MySQL的server,connection,database, client四个环节全部统一使用UTF8处理;server是MySQL自己的配置文件决定,database的编码在设计数据库时定义,使用数据库的程序就是client, 而程序与MySQL RDBMS通讯使用的connection的编码则需要各自的编程语言提供指定的方法:在php中,在同一个数据库连接中确保在所有语句前执行'set names utf8'通知MySQL连接中传送的流使用的是UTF8编码,从而避免服务器端接受到流时尝试错误的转码;对于JAVA,在JDBC URL中加入参数也可以起到同样的效果,现在我的问题是:在ror中,连接数据库时如何通知数据库当前使用的编码是UTF8?我的猜测是作为数据库客户端的ror程序已经是采用UTF8编码的了,webrick默认的输出就是UTF8的页面,显然浏览器如果要传递数据的话也一定会使用UTF8编码传回数据,而ror写入数据库的时候应该直接写入字节流(很像PHP的作法).
在我的学习程序中,虽然ror本身可以正确的写入和读取UTF8流里的汉字,但是phpMyAdmin却读取值域为无意义的乱码,分析如下:
由于没有指定utf8的connection(在我的*nix机器上走的是UNIX socket通讯)编码,服务器端错误的判断连接使用的是默认的ISO-8859-1的编码(MySQL手册中解释的很清楚),传过来的是ISO-8859-1的字节流,由于要写入utf8的数据库,所以服务器端自动进行了转码,"ISO-8859-1"->"UTF8",虽然被转换的本身就是UTF8的字节流;此时将转码后的字节流直接当做UTF8字节流读取显然是无法还原中文的(phpMyAdmin所做的事);但是ror自己在读取数据的时候由于仍然被当做使用默认的ISO-8859-1编码,数据库在又做了一次所谓的"UTF-8"->"ISO-8859-1"的转码再将字节流写入connection,ror直接当做UTF8流读取于是倒也能正确的还原中文.
上面的推测是由于这个现象同以前开发PHP的UTF8程序是碰到的现象一模一样,总结PHP上的经验得出的,当然,有可能是彻底的错误,希望大家在目前ror中文utf8处理方面不吝赐教.