我---7号斋主人

已婚
爱老婆
I wanna be a happy fish...

星期二, 十月 17, 2006

ror+mysql中文乱码的问题(原)

环境:windows+ror+mysql
客户端:ie,firefox,mysql-front,navicat
-------------
结论:
1、修改database.yml,在连接数据库的设置部分,添加一行设置:

encoding: utf8

2、修改application.rb,添加:
before_filter :set_charset
def set_charset
if request.xhr?
@headers["Content-Type"] = "text/javascript; charset=utf-8"
else
@headers["Content-Type"] = "text/html; charset=utf-8"
end
end

则使用mysql-front访问和页面访问,均无乱码现象。使用navicat作为客户端utf-8编码访问,则中文均为?。

重要:发现之前发的几篇转摘的文章中提到的在environment.rb中添加2行之后,apache可以启动,webrick启动的时候直接就报错。对本地化还在探讨中...

又一篇好文:关于ruby本地化

来源:railscn.com
直接复制了,懒得整理。
传统的做法是用gettext来按locale处理文本,详见Using Gettext To Translate Your Rails Application
一般为了简化编码从页面到代码到数据库统统用utf-8,否则就需要用iconv来转码了。。。

一些标准设置:environment.rb里加

$KCODE = 'u'
require 'jcode'

为了让字符串按utf-8处理。

ApplicationController里加
before_filter :set_charset
def set_charset
if request.xhr?
@headers["Content-Type"] = "text/javascript; charset=utf-8"
else
@headers["Content-Type"] = "text/html; charset=utf-8"
end
end


Robbin问我Time.now的格式怎么办,日期、货币、数字的格式不是简单文本替换了,这个gettext没法处理。看了一下Rails的三个本地化插件,其中Globalize开发较活跃。安装如下
plugin/insall http://svn.globalize-rails.org/svn/globalize/globalize/trunk


或者用配合1.1的开发版本
plugin/install http://svn.globalize-rails.org/svn/globalize/globalize/branches/for-1.1


然后执行
ruby script/generate globalize
来产生migration文件,执行
rake migrate
更新数据库。然后在environment.rb里加上
include Globalize
Locale.set_base_language 'en-US'
Locale.set 'en-US'
也可以换别的编码标准如zh-CN,注意这里locale中间是-不是_。

然后可以用各种格式了:
>>Locale.language
=>English
>>Locale.set 'zh-CN'
=>...
>>Time.now.localize '%d %B %Y'
=>'05 六月 2005' (这个在console里还是乱码,不过在页面上正常)
>>Locale.set 'es-ES' (西班牙)
>>Time.now.loc '%d %B %Y' (localize的简写)
=>'05 Junio 2006'


还有和AR结合的用法,和gettext差不多。更多的内容参考Globalize主页。

关于ror开发中文网站的相关信息,railscn wiki上也有。

关于ror连接mysql中文乱码的问题

懒得整理了,内容中主要涉及ror和mysql连接时,页面中文正常显示,用客户端直接连数据库中文乱码的问题:

Pocky: mysql的编码设置为utf-8,完了之后,数据在页面操作的时候,都正常,可是用数据库客户端去连的时候,这个中文乱码是怎么解决的来着?

chinaonrails: <chf99cn> 你的客户端工具是什么?
<wwpizi> me too 我也有这个问题

Pocky: front啊
我以前曾经设置好了的,可是现在搞不定了。

chinaonrails: <chf99cn> 你从数据库中读出数据是乱码么?

Pocky: 是乱码
ÅçÎâç÷Îâ 这种样子的,不是其他什么编码格式

chinaonrails: <wwpizi> 你把数据库编码设置成 utf-8

Pocky: 我数据库就是utf-8

chinaonrails: <wwpizi> 这样可以保证 你在页面显示是正确的
<chf99cn> 首先在environment.rb里加入 $KCODE = 'U'
<chf99cn> REQUIRE 'jode'
<chf99cn> def configure_charsets
@response.headers["Content-Type"] = "text/html; charset=utf-8"
# Set connection charset. MySQL 4.0 doesn’t support this so it
# will throw an error, MySQL 4.1 needs this
suppress(ActiveRecord::StatementInvalid) do
ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
end
end
<chf99cn> 加在application.rb
<chf99cn> before_filter :configure_charsets

Pocky: 哦,environment没有设。

chinaonrails: <chf99cn> 我的数据库客户端工具是用的Navicat,没有问题

Pocky: 你是不是漏了数据库配置的YML文件,要加个encoding:utf8吧?



下面是转自:http://www.blogjava.net上的一篇文章,还提到中文时间格式的问题。
Ruby on Rails 学习:解决中文乱码问题
初学Rails,简单的做了一个例子,发现存在中文问题。
大致中文问题归类如下:
1、页面无法显示中文,产生中文乱码
2、Mysql数据库采用utf8后,页面采用utf8,数据库保存是乱码,但页面显示正常。
3、时间格式在页面上的中文显示产生乱码。
打开:application.rb:修改代码如下显示:
class ApplicationController < ActionController::Base
before_filter :set_charset
def set_charset
@headers["Content-Type"] = "text/html; charset=utf-8"
end
end

星期一, 十月 16, 2006

Apache+FastCGI+Rails(新)

对于在apache+fastcgi上跑rails的程序,一些新的判断:
1、目前为止的apache最高版本2.2.3,mod_fastcgi.so的最高版本1.3.1,这两个版本是不兼容的,也就是说,在windows上配置,fcgi不工作;
2、使用apache2.0.59与mod_fastcgi.so1.3.1,是可以正常工作的;
3、网上也有以上的指出,并提到了mod_fcgid.so,是可以支持apache2.2.3实现fcgi的,我配置了很久,没有成功,放弃了。

PS:要指出的一件事情是,要将mod_fastcgi.dll改名为libfcgi.dll然后复制到c:\windows\system32中去,同样的配置去配置mod_fcgid.so,我没有尝试过,可以试看看。
在上述的1中,我测试过,将libfcgi.dll(即改名后的mod_fastcgi.dll)删除的话,重启动apache,rails就跑不起来了。

共勉之。