Ruby `CSV.read` 错误 UTF-8 中的无效字节序列 (ArgumentError)

标签 ruby csv ruby-csv

首先,这不是 SO question 的副本这里 .我有一个用 Shift-JIS 编码的 csv 文件 这是我解析文件的脚本

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]

但即使在指定编码之后,我仍得到 invalid byte sequence in UTF-8 (ArgumentError) 。有什么想法吗?我的 ruby 是 2.3.0

最佳答案

首先,你的编码看起来不对:

'社員番号'.force_encoding("Shift_JIS").encode!
#=> "\x{E7A4}\xBE\x{E593}\xA1\x{E795}\xAA\x{E58F}\xB7"

force_encodingstr1 中获取字节并将它们解释为 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 读取 Shift JIS 数据并将其转码为 UTF-8。这相当于将 'r:Shift_JIS:UTF-8' 传递给 File.open

关于Ruby `CSV.read` 错误 UTF-8 中的无效字节序列 (ArgumentError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39509417/

相关文章:

ruby - 什么在 Ruby : defining the alias method or using alias_method? 中运行得更快

Ruby IMAP 登录错误异常

Ruby local_variable 保持对@instance_variable 的引用

python - 如何从 CSV 中获取特定表格并用 Python 编写新文件?

php - 使用 OpenOffice 制作 csv 文件并使用 php 转储 csv 数据

android - 在 Kotlin 中逐行读取 CSV

StringIO 的 Ruby CSV BOM|UTF-8 编码

ruby-on-rails - 如何解决 "Can' t mass-assign protected attributes : translations_attributes"error?