ActiveRecord Sql Server中文问题

最近在尝试使用ActiveRecord连接使用Sql server,发现中文编码问题始终让人困惑。

google一把也没发现多少有建设性的提示。

以下是本人经过尝试发现可行的两种方法。直接贴代码进行解释(还不知道怎么着色代码,不好意思,幸好代码短小)

方法一:文件保存格式ANSI

# coding : gb2312     #指示字符串编码为gb2312
require "rubygems"
require "active_record"
require 'odbc_utf8'   #使用odbc utf8的版本,才能支持数据库中文插入
require 'iconv'        #编码转换库
conv=Iconv.new('UTF-8','GB2312')    #从GB2312 转换为数据库需要的utf-8
convBack=Iconv.new('GB2312','UTF-8')  #数据库utf-8编码转换为gb2312

ActiveRecord::Base.establish_connection(
    :adapter => "sqlserver",
    :mode=>"odbc",
    :dsn=>"localhost",
    :database=> "ruby",
    :username => "sa",
    :password => "123",
    :encoding=>"gb2312"
)

class Road < ActiveRecord::Base

end

d=Road.find 1
puts '高速公路公司'     #由于字符串编码已指明为gb2312,直接输出不乱码
begin
d.road_name=conv.iconv("高速公路公司")   #存入数据库需把gb2312转为utf-8
d.save
puts 'done!'
end
s=Road.find 1
puts convBack.iconv(s.road_name)    #从数据库读出utf-8编码,转换为gb2312
puts "成功"







 方法二:文件保存格式UTF-8

# coding : utf-8               #指示源文件字符编码格式为utf-8
require "rubygems"
require "active_record"
require 'odbc_utf8'         # odbc utf8版本
require 'iconv'
conv=Iconv.new('GB2312','UTF-8')  # utf-8 转gb2312


ActiveRecord::Base.establish_connection(
    :adapter => "sqlserver",
    :mode=>"odbc",
    :dsn=>"localhost",
    :database=> "ruby",
    :username => "sa",
    :password => "123",
    :encoding=>"gb2312"
)

class Road < ActiveRecord::Base

end

d=Road.find 1
puts conv.iconv('高速公路')   #utf-8 转换为gb2312输出
begin
d.road_name='广清高速公路'     # 编码为utf-8 ,符合数据库要求
d.save
puts 'done!'
end
s=Road.find 1
puts conv.iconv(s.road_name)   #utf-8 转换为gb2312输出






 还没有测试过进程外输入的编码问题,不过估计 -E选项+适当的编码转换可以解决这个问题。

 

 

posted @ 2010-08-04 22:33  damnit  阅读(424)  评论(0)    收藏  举报