Ruby将CSV文件读取为UTF-8和/或将ASCII-8Bit编码转换为UTF-8
我使用ruby1.9.2
我试图parsing一个包含一些法语单词(例如spécifié) 的CSV文件 ,并将内容放在MySQL数据库中。
当我从CSV文件中读取行时,
file_contents = CSV.read("csvfile.csv", col_sep: "$")
元素返回为ASCII-8BIT编码的string(spécifié变成sp \ xE9cifi \ xE9),然后像“spécifié”这样的string不能正确保存到我的MySQL数据库中。
耶胡达卡茨说,ASCII-8BIT是真正的“二进制”的数据,这意味着CSV不知道如何读取适当的编码。
所以,如果我试图使CSV像这样编码:
file_contents = CSV.read("csvfile.csv", col_sep: "$", encoding: "UTF-8")
我得到以下错误
ArgumentError: invalid byte sequence in UTF-8:
如果我回到我的原始ASCII-8BIT编码string,并检查我的CSV读取为ASCII-8BIT的string,它看起来像这个“Non sp \ xE9cifi \ xE9”而不是“Nonspécifié”。
我无法使用"Non sp\xE9cifi\xE9".encode("UTF-8")
将“Non sp \ xE9cifi \ xE9”转换为“Nonspécifié”。
因为我得到这个错误:
Encoding::UndefinedConversionError: "\xE9" from ASCII-8BIT to UTF-8
Katz指出会发生这种情况,因为ASCII-8BIT并不是真正的string“编码”。
问题:
- 我可以得到CSV来读取我的文件在适当的编码? 如果是这样,怎么样?
- 如何将ASCII-8BITstring转换为UTF-8以在MySQL中正确存储?
欺骗是正确的,那就是ISO8859-1(AKA Latin-1)编码的文本。 尝试这个:
file_contents = CSV.read("csvfile.csv", col_sep: "$", encoding: "ISO8859-1")
如果这样做不起作用,可以使用Iconv
来修改单个string,如下所示:
require 'iconv' utf8_string = Iconv.iconv('utf-8', 'iso8859-1', latin1_string).first
如果"Non sp\xE9cifi\xE9"
是"Non sp\xE9cifi\xE9"
,那么utf8_string
将是"Non spécifié"
。 而且, Iconv.iconv
可以一次Iconv.iconv
整个数组的Iconv.iconv
:
utf8_strings = Iconv.iconv('utf-8', 'iso8859-1', *latin1_strings)
随着更新的ruby,你可以做这样的事情:
utf8_string = latin1_string.force_encoding('iso-8859-1').encode('utf-8')
其中latin1_string
认为它是在ASCII-8BIT,但真正在ISO-8859-1。
随着ruby> = 1.9,你可以使用
file_contents = CSV.read("csvfile.csv", col_sep: "$", encoding: "ISO8859-1:utf-8")
ISO8859-1:utf-8
的含义是:csv文件是ISO8859-1编码的,但是把内容转换为utf-8
如果你喜欢更详细的代码,你可以使用:
file_contents = CSV.read("csvfile.csv", col_sep: "$", external_encoding: "ISO8859-1", internal_encoding: "utf-8" )
我一直在处理这个问题一段时间,而没有任何其他解决scheme为我工作。
诀窍就是将冲突string存储在二进制文件中,然后正常读取文件并使用此string来提供CSV模块:
tempfile = Tempfile.new("conflictive_string") tempfile.binmode tempfile.write(conflictive_string) tempfile.close cleaned_string = File.read(tempfile.path) File.delete(tempfile.path) csv = CSV.new(cleaned_string)
- 使用FFMPEG库和iPhone SDK进行video编码
- 有没有一个标准的方法来编码一个.NETstring为JavaScriptstring在MS Ajax中使用?
- 在JavaScript中编码的URL?
- 在构build使用数据的XmlReader或XPathDocument之前,如何从基于XML的数据源中删除无效的hex字符?
- decodeURIComponent vs unescape,unescape有什么问题?
- 在Python中pipe理标准输出时设置正确的编码
- 为什么真实世界的服务器更喜欢使用gzip而不是deflate编码?
- 什么是基地64编码用于?
- 使用PowerShell以不含BOM的UTF-8编写文件