Как я могу преобразовать строку из windows-1252 в utf-8 в Ruby? - PullRequest
9 голосов
/ 04 июня 2009

Я переношу некоторые данные из 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 ]

10 голосов
/ 09 июня 2009

Для Ruby 1.8.6, кажется, вы можете использовать Ruby Iconv, часть стандартной библиотеки:

Документация 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]
9 голосов
/ 04 июня 2009

Если вы используете 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'
3 голосов
/ 24 июня 2009

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.

Веселись и много клянись!

2 голосов
/ 04 июня 2009

Если вы НЕ на 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
2 голосов
/ 04 июня 2009

Если вы хотите преобразовать файл с именем win1252file, в операционной системе Unix запустите:

$ iconv -f windows-1252 -t utf-8 win1252_file > utf8_file

Вероятно, вы сможете сделать то же самое в Windows с помощью cygwin.

...