2009-06-04 22 views
8

Estoy migrando algunos datos de MS Access 2003 a MySQL 5.0 usando Ruby 1.8.6 en Windows XP (escribiendo una tarea de Rake para hacer esto).¿Cómo puedo convertir una cadena de windows-1252 a utf-8 en Ruby?

Resulta que los datos de la cadena de Windows están codificados como windows-1252 y Rails y MySQL están asumiendo la entrada de utf-8, por lo que algunos de los caracteres, como los apóstrofos, se descomponen. Terminan como "a" s con un acento sobre ellos y cosas así.

¿Alguien sabe de una herramienta, biblioteca, sistema, metodología, ritual, hechizo o conjuro para convertir una cadena de Windows-1252 a utf-8?

+0

Cuando dice "Estoy migrando algunos datos de MS Access 2003 a MySQL 5.0", lo que quiere decir es "Estoy migrando algunos datos de MS Jet 4 a MySQL 5.0". La diferencia es crucial: no está utilizando Access, solo el motor de la base de datos Jet. –

+0

Gracias, eso es bueno saberlo. – Ethan

Respuesta

10

para Ruby 1.8.6, parece que puede utilizar Rubí Iconv, parte de la biblioteca estándar:

Iconv documentation

Según este helpful article, parece que al menos pueden purga no deseados caracteres win-1252 de la cadena, así:

ic = Iconv.new('UTF-8//IGNORE', 'UTF-8') 
valid_string = ic.iconv(untrusted_string + ' ')[0..-2] 

Entonces, se podría tratar de hacer una conversión completa de esta manera:

ic = Iconv.new('UTF-8', 'WINDOWS-1252') 
valid_string = ic.iconv(untrusted_string + ' ')[0..-2] 
9

Si estás en 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' 
+0

Gracias, eso es bueno saberlo. Sin embargo, actualmente estoy lidiando con Ruby 1.8.6. Supongo que podría instalar 1.9, RubyGems, etc. – Ethan

+3

Espero que ruby ​​no codifique "Fåbulous" en "Fabulous" ya que "å" es un personaje muy diferente de "a" para cualquier idioma que lo posea. Si la cadena codificada en UTF-8 se imprimiera en la página de códigos de Windows 1252, la cadena debería parecerse a "F ¥ bulous" y si está impresa en UTF-8 debería ser "FÁbulous". –

2

Si desea convertir un archivo llamado win1252file, en un sistema operativo UNIX, ejecute:

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

probablemente debería poder hacer lo mismo en Windows con cygwin.

+0

Gracias, genial saberlo para el futuro, pero no estoy seguro de cómo lo haría en esta situación, ya que estoy tratando con MS Access y MySQL en un entorno Windows XP, no Cygwin. – Ethan

2

Si eres NO en Ruby 1.9, y asumiendo yhager 's comando funciona, puede intentar

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 
+0

Whoops: esto falla por la misma razón que yhager: Windows no tiene iconv (o directorio/tmp /, para el caso). Hmm ... –

3

Hy,

que tenía el mismo problema.

Estos consejos me ayudaron a conseguir goin:

Comprobar siempre el nombre de codificación adecuada con el fin de alimentar a sus herramientas de conversión correctamente. de duda se puede obtener una lista de codificaciones soportadas por iconv o recodificar usando:

$ recode -l 

o

$ iconv -l 

Comience siempre de usted archivo original y codificar una muestra para trabajar con:

$ recode windows-1252..u8 <original.txt> sample_utf8.txt 

o

$ iconv -f windows-1252 -t utf8 original.txt -o sample_utf8.txt 

Instale Ruby1.9, porque le ayuda MUCHO cuando se trata de codificaciones. Incluso si no lo usa en su programa, siempre puede iniciar una sesión irb1.9 y seleccionar las cadenas para ver cuál es la salida. File.open tiene un nuevo parámetro 'modo' en Ruby 1.9. Úselo! Este artículo ha ayudado mucho: 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. 

divertirse y juran mucho!

Cuestiones relacionadas