Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中读取带有特殊字符的CSV文件并存储到SQL Server中_Ruby_Sql Server_Csv_Special Characters_Ruby 2.0 - Fatal编程技术网

在Ruby中读取带有特殊字符的CSV文件并存储到SQL Server中

在Ruby中读取带有特殊字符的CSV文件并存储到SQL Server中,ruby,sql-server,csv,special-characters,ruby-2.0,Ruby,Sql Server,Csv,Special Characters,Ruby 2.0,我正试图将Ruby(2.0.0)中的CSV文件(UTF-8编码)导入我的数据库(MSSQL 2008R2,COLLATION French_CI_AS),但特殊字符(元音上的法语重音)没有正确存储:变成jibberish 我使用这段代码读取文件: CSV.foreach(file, col_sep: ';', encoding: "utf-8") do |row| # ... end 我在CSV选项中尝试了各种编码(utf-8,iso-8859-1,windows-1252),但没有一个

我正试图将Ruby(2.0.0)中的CSV文件(UTF-8编码)导入我的数据库(MSSQL 2008R2,
COLLATION French_CI_AS
),但特殊字符(元音上的法语重音)没有正确存储:
变成
jibberish

我使用这段代码读取文件:

CSV.foreach(file, col_sep: ';', encoding: "utf-8") do |row|
   # ...
end
我在CSV选项中尝试了各种编码(
utf-8
iso-8859-1
windows-1252
),但没有一个能正确存储特殊字符

在您提问之前,我的数据库排序规则支持这些字符,因为我们已经成功导入了包含使用PHP导入器的字符的数据。如果我使用
put
或文件记录器转储数据,则一切正常

我的代码是否有问题,或者是否需要指定其他内容(例如ruby类文件编码)

谢谢

编辑:数据保存由一个PHP REST API完成,该API可以很好地处理重音字符。它在接收数据时存储数据

在Ruby中,我解析数据,将其存储在一个对象中,然后在PUT请求体中发送JSON编码的对象。但是,如果直接从Ruby使用SQL查询,问题仍然存在:

query = <<-SQL
    UPDATE MyTable SET MyTable_title = '#{row_data['title']}' WHERE MyTable_id = '#{row_data['id']}'
SQL
res = db.execute query

query=我认为这与您的CSV文件的编码类型有关,所以开始对此进行深入研究。我确实发现windows-1252编码将插入控制字符


您可以在此处阅读更多信息:

您已经转储了数据,并且一切都是正确的,因为您使用
utf-8
读卡器读取了
utf-8
-编码文件。问题显然是在数据库中插入。您是否介意共享用于将其存储到数据库中的代码?我打赌用
str.encode('iso-8859-1')
而不是仅仅用
str
就能解决问题。编辑我的帖子回答你的问题。添加手动编码并不能解决问题,存储的值仍然是jibberish…API不能“很好地处理重音字符”,因为API没有“重音字符”的概念。它只接收一个ByTestStream并将其进一步传递给mysql适配器。mysql
client\u encoding
参数必须与此ByTestStream的实际编码匹配,这一点很重要。因此,手动编码是必要的。我们使用PHP微框架和Doctrine2链接到数据库对象。我们从未对重音字符有过任何问题,如果它们在请求中被正确传递,它们将被正确存储。我无法理解“正确传递”是什么意思。UTF-8中的“ç”是2字节,ISO-8859-1中的相同符号是1字节。你认为什么是正确的?无论API是否需要ISO-8859-1,以及您是否一直通过ISO-8859-1,我建议您告诉ruby将结果也转换为ISO-8859-1。