Ruby `CSV.read` ошибка неверной последовательности байтов в UTF-8 (ArgumentError)
Прежде всего, это не дубликат этого SO вопроса. У меня есть файл 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]
но даже после указания enconding, я получаю invalid byte sequence in UTF-8 (ArgumentError)
, Какие-нибудь мысли? Мой рубин 2.3.0
1 ответ
Прежде всего, ваша кодировка выглядит неправильно:
'社員番号'.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
читать данные Shift JIS и транскодировать их в UTF-8. Это эквивалентно прохождению 'r:Shift_JIS:UTF-8'
в File.open