先说明下问题出现的环境
引用
ruby 1.8.5
rails 1.1.6
mysql 5
数据库使用gb2312编码
在config中特别设置了encoding: gb2312属性
开发工具用vim,文件编码用gb2312
每一个action都有设置“charset=gb2312”
ruby的string编码没有特别设置。
在开发的时候用到了中文文本的词语统计功能。其先选择了String.count,不过这个函数怎么调用的结果都不对。
只要count的对象是中文的词组,那么结果就是错误的。
于是就使用了scan,很好.每次都是正确的。编写了一小段的测试代码,保证每一错误之后,就写到了action中。
测试过程中,发现有个特殊的字 "出"字。只要被统计的词组中带有这个"出"字,就会提示错误。错误提示如下
引用
premature end of regular expression: /\263�
不过在单独的测试代码中,这个字并不会引起错误. 仔细检查了这个字的输入和输出过程,发现了些问题.
比如,往数据库中添加 “促出”这个词组时,log中 post的数据是
引用
"word"=>"\264俪\366"
sql语句中插入的数据是
引用
VALUES(NULL, NULL, '促?
当然在mysql中,用mysql-front察看的结果 还是"促出",一点都没差。但是一旦从数据库中读取出来,用到mytext.scan(a.word)时,就会提示上面的 scan错误.
从这些表象看起来,scan是把字符转换编码之后才开始查找字符串的。很不巧的是,‘出’的转换似乎有些异常。 但是这个对于测试代码中用到 scan('出')是解释不通的。
而且 从数据库中读取的a.word的内容,如果直接输出到log,或者检测其长度,都是正确的。唯独scan使用后就会有异常。
这里有些疑问,希望了解的同学解答下.
第一:post上来的中文为啥不用gb2312编码,看上去像utf-8 或者utf-16的编码,这个能否调整.
第二:sql语句插入时,为什么只能看到一半的字。而数据库中又是正常的.
第三:怎么绕过这个奇怪的编码问题?