Como posso converter uma cadeia de windows-1252 para utf-8 em Ruby?

votos
9

Eu estou migrando alguns dados do MS Access 2003 para MySQL 5.0 usando Ruby 1.8.6 no Windows XP (escrevendo uma tarefa Rake para fazer isso).

Acontece que os dados de cadeia do Windows é codificado como windows-1252 e Rails e MySQL são ambos assumindo entrada utf-8 para que alguns dos personagens, como apóstrofos, estão ficando mutilado. Eles acabam como a s com um acento sobre eles e coisas assim.

Alguém sabe de uma ferramenta, biblioteca, sistema, metodologia, ritual, período, ou encantamento para converter uma cadeia windows-1252 para utf-8?

Publicado 04/06/2009 em 18:12
fonte usuário
Em outras línguas...                            


5 respostas

votos
10

Para o Ruby 1.8.6, parece que você pode usar Ruby Iconv, parte da biblioteca padrão:

documentação iconv

De acordo com este artigo útil , parece que você pode, pelo menos purga personagens win-1252 indesejados de sua string assim:

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

Pode-se, em seguida, tentar fazer uma conversão completa assim:

ic = Iconv.new('UTF-8', 'WINDOWS-1252')
valid_string = ic.iconv(untrusted_string + ' ')[0..-2]
Respondeu 09/06/2009 em 08:15
fonte usuário

votos
9

Se você estiver em 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'
Respondeu 04/06/2009 em 18:27
fonte usuário

votos
3

Hy,

Eu tive o mesmo problema.

Essas dicas me ajudou a conseguir indo:

Verifique sempre o nome codificação adequada, a fim de alimentar suas ferramentas de conversão corretamente. Na dúvida, você pode obter uma lista de codificações suportados para iconv ou recodificar usando:

$ recode -l

ou

$ iconv -l

Sempre comece a partir de seu arquivo original e codificar uma amostra para trabalhar com:

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

ou

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

Instale Ruby1.9, porque ajuda muito quando se trata de codificações. Mesmo se você não usá-lo em seu Programa, você sempre pode iniciar uma sessão de irb1.9 e pegar nas cordas para ver o que a saída é. File.open tem um parâmetro novo 'modo' em Ruby 1.9. Use-o! Este artigo ajudou muito: 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.

Divirta-se e juram muito!

Respondeu 24/06/2009 em 18:06
fonte usuário

votos
2

Se você é NÃO em Ruby 1.9, e assumindo yhager comando funciona 's, você pode tentar

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
Respondeu 04/06/2009 em 19:14
fonte usuário

votos
2

Se você quiser converter um arquivo chamado win1252file, em um sistema operacional UNIX, execute:

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

Você provavelmente deve ser capaz de fazer o mesmo no Windows com cygwin.

Respondeu 04/06/2009 em 18:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more