在Ruby中读取包含特殊字符的CSV文件并存储到SQL Server中
问题描述:
我试图将Ruby(2.0.0)中的CSV文件(UTF-8编码)导入到我的数据库(MSSQL 2008R2,COLLATION French_CI_AS
)中,但特殊字符(法语元音元音)没有正确存储:éèçôü
变为éèçôü
(或其他类似的乱码)。在Ruby中读取包含特殊字符的CSV文件并存储到SQL Server中
我用这段代码读取文件:
CSV.foreach(file, col_sep: ';', encoding: "utf-8") do |row|
# ...
end
我试图在CSV选项(utf-8
,iso-8859-1
,windows-1252
)各种编码,但没有人会正确地存储的特殊字符。
在您提出问题之前,我的数据库整理支持这些字符,因为我们已成功导入包含使用PHP导入程序的数据。如果我使用puts
或文件记录器转储数据,那么一切都是正确的。
我的代码有问题吗?或者我需要指定其他内容(例如ruby类文件编码)?
感谢
编辑:的数据保存是由PHP的REST API,正常工作与重音字符完成。它按收到的数据存储数据。
在Ruby中,我解析数据,将其存储在一个对象中,然后将JSON编码的对象发送到我的PUT请求的正文中。但是,如果我直接使用SQL查询从红宝石,问题依然存在:
query = <<-SQL
UPDATE MyTable SET MyTable_title = '#{row_data['title']}' WHERE MyTable_id = '#{row_data['id']}'
SQL
res = db.execute query
答
我在想,这有一些东西需要与您的CSV文件的编码类型,所以开始在周围挖。我确实发现windows-1252编码会插入控制字符。
你可以阅读更多关于它在这里:Converting special charactes such as ü and à back to their original, latin alphbet counterparts in C#
您有倾倒的数据,一切是正确的,因为你阅读'UTF-8'读者'UTF-8'编码的文件。问题显然在_inserting into database_中。你介意分享你用来存储到数据库中的代码吗?我敢打赌,把str.encode('iso-8859-1')'而不是只是'str'就能解决问题。 – mudasobwa
编辑我的帖子来回答你的问题。添加一个手动编码并不能解决问题,存储的值仍然是乱码... – 3rgo
由于没有API的“重音字符”概念,API不能“与重音字符一起工作”。它只是接收一个字节流并将其传递给mysql适配器。重要的是,mysql'client_encoding'参数_必须匹配这个字节流的真实编码。所以,手动编码是必要的。 – mudasobwa