Как я могу преобразовать строку из windows-1252 в utf-8 в Ruby?
Я переношу некоторые данные из MS Access 2003 в MySQL 5.0, используя Ruby 1.8.6 в Windows XP (для этого пишу задачу Rake).
Оказывается, строковые данные Windows кодируются как windows-1252, а Rails и MySQL предполагают ввод utf-8, поэтому некоторые символы, такие как апострофы, становятся искаженными. Они заканчиваются как "а" с акцентом на них и тому подобное.
Кто-нибудь знает инструмент, библиотеку, систему, методологию, ритуал, заклинание или заклинание для преобразования строки windows-1252 в utf-8?
5 ответов
Для Ruby 1.8.6, кажется, вы можете использовать Ruby Iconv, часть стандартной библиотеки:
Согласно этой полезной статье, вы можете по крайней мере удалить ненужные символы win-1252 из вашей строки следующим образом:
ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]
Затем можно попытаться выполнить полное преобразование следующим образом:
ic = Iconv.new('UTF-8', 'WINDOWS-1252')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]
Если вы на Ruby 1.9...
string_in_windows_1252 = database.get(...)
# => "Fåbulous"
string_in_windows_1252.encoding
# => "windows-1252"
string_in_utf_8 = string_in_windows_1252.encode('UTF-8')
# => "Fabulous"
string_in_utf_8.encoding
# => 'UTF-8'
Hy,
У меня была точно такая же проблема.
Эти советы помогли мне начать:
Всегда проверяйте правильное имя кодировки для правильной подачи ваших инструментов преобразования. В случае сомнений вы можете получить список поддерживаемых кодировок для iconv или перекодировать, используя:
$ recode -l
или же
$ iconv -l
Всегда начинайте с исходного файла и кодируйте образец для работы с:
$ recode windows-1252..u8 < original.txt > sample_utf8.txt
или же
$ iconv -f windows-1252 -t utf8 original.txt -o sample_utf8.txt
Установите Ruby1.9, потому что это поможет вам много, когда дело доходит до кодирования. Даже если вы не используете его в своей программе, вы всегда можете запустить сеанс irb1.9 и выбрать строки, чтобы увидеть, что выводится. File.open имеет новый параметр 'mode' в Ruby 1.9. Используй это! Эта статья очень помогла: http://blog.nuclearsquid.com/writings/ruby-1-9-encodings
File.open('original.txt', 'r:windows-1252:utf-8')
# This opens a file specifying all encoding options. r:windows-1252 means read it as windows-1252. :utf-8 means treat it as utf-8 internally.
Веселись и много клянись!
Если вы НЕ используете Ruby 1.9 и предполагаете, что команда yhager работает, вы можете попробовать
File.open('/tmp/w1252', 'w') do |file|
my_windows_1252_string.each_byte do |byte|
file << byte
end
end
`iconv -f windows-1252 -t utf-8 /tmp/w1252 > /tmp/utf8`
my_utf_8_string = File.read('/tmp/utf8')
['/tmp/w1252', '/tmp/utf8'].each do |path|
FileUtils.rm path
end
Если вы хотите преобразовать файл с именем win1252file, в операционной системе Unix выполните:
$ iconv -f windows-1252 -t utf-8 win1252_file > utf8_file
Вы, вероятно, сможете сделать то же самое на Windows с Cygwin.