首先,这里不是这个的复制品
.I有一个csv文件编码在Shift-JIS
这是我解析文件的脚本
require 'csv'
str1 = '社員番号'
str2 = 'メールアドレス'
str1.force_encoding("Shift_JIS").encode!
str2.force_encoding("Shift_JIS").encode!
file=File.open("SyainInfo.csv", "r:Shift_JIS")
csv = CSV.read(file, headers: true)
p csv[str1]
p csv [str2]
但即使在指定了encoding之后,我也会得到
invalid byte sequence in UTF-8 (ArgumentError)
有什么想法吗我的红宝石是2.3.0 最佳答案
首先,你的编码看起来不对:
'社員番号'.force_encoding("Shift_JIS").encode!
#=> "\x{E7A4}\xBE\x{E593}\xA1\x{E795}\xAA\x{E58F}\xB7"
force_encoding
从str1
获取字节并将其解释为shift jis,而您可能希望将字符串转换为shift jis:'社員番号'.encode('Shift_JIS')
#=> "\x{8ED0}\x{88F5}\x{94D4}\x{8D86}"
接下来,您可以将文件名传递给
CSV.read
,而不是:file = File.open(filename)
CSV.read(file)
你可以写:
CSV.read(filename)
也就是说,您可以使用Shift-JIS编码的字符串:
require 'csv'
str1 = '社員番号'.encode("Shift_JIS")
str2 = 'メールアドレス'.encode("Shift_JIS")
csv = CSV.read('SyainInfo.csv', encoding: 'Shift_JIS', headers: true)
csv[str1]
csv[str2]
或者——这就是我要做的——您可以通过指定第二种编码来使用UTF-8字符串:
require 'csv'
str1 = '社員番号'
str2 = 'メールアドレス'
csv = CSV.read('SyainInfo.csv', encoding: 'Shift_JIS:UTF-8', headers: true)
csv[str1]
csv[str2]
encoding: 'Shift_JIS:UTF-8'
指示CSV
读取移位JIS数据并将其转换为UTF-8它相当于将'r:Shift_JIS:UTF-8'
传递到File.open
关于ruby - Ruby`CSV.read`错误UTF-8中的无效字节序列(ArgumentError),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39509417/