Hvordan kan jeg konvertere en streng fra windows-1252 til utf-8 i ruby?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg migrerer nogle data fra MS Access 2003 til MySQL 5.0 ved hjælp af Ruby 1.8.6 på Windows XP (skriver en Rake-opgave for at gøre dette).


Viser sig, at Windows-strengens data er kodet som Windows-1252, og Rails og MySQL antager begge utf-8-input, så nogle af tegnene, som f.eks. Apostrofer, bliver manglet. De vender op som 'a' s med en accent over dem og ting sådan.


Er der nogen der kender til et værktøj, bibliotek, system, metodologi, ritual, stave eller incantation til at konvertere en Windows-1252-streng til utf-8?

Bedste reference


For Ruby 1.8.6 ser det ud til, at du kan bruge Ruby Iconv, en del af standardbiblioteket:


Iconv dokumentation [11]


I henhold til denne nyttige artikel vises det, at du i det mindste kan rense uønskede sejre-1252 tegn fra din streng som sådan: [12]


ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid\_string = ic.iconv(untrusted\_string + ' ')[0..-2]


Man kan så forsøge at gøre en fuld konvertering som sådan:


ic = Iconv.new('UTF-8', 'WINDOWS-1252')
valid\_string = ic.iconv(untrusted\_string + ' ')[0..-2]

Andre referencer 1


Hvis du er på 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'

Andre referencer 2


Hy,


Jeg havde det samme problem.


Disse tips hjalp mig med at få gået:


Kontroller altid for det korrekte kodningsnavn for at kunne forsyne dine konverteringsværktøjer korrekt.
I tvivl kan du få en liste over understøttede kodninger til iconv eller recode ved hjælp af:


$ recode -l


eller


$ iconv -l


Start altid fra din originale fil, og kode en prøve for at arbejde med:


$ recode windows-1252..u8 < original.txt > sample\_utf8.txt


eller


$ iconv -f windows-1252 -t utf8 original.txt -o sample\_utf8.txt


Installer Ruby1.9, fordi det hjælper dig meget når det kommer til kodninger. Selvom du ikke bruger det i dit program, kan du altid starte en irb1.9 session og vælge på strengene for at se, hvad outputen er.
File.open har en ny 'mode' parameter i Ruby 1.9. Brug det!
Denne artikel hjalp meget: http://blog.nuclearsquid.com/writings/ruby-1-9-encodings[13]


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.


Hav det sjovt og sværge meget!

Andre referencer 3


Hvis du vil konvertere en fil med navnet win1252file, på et unix OS, kør:


$ iconv -f windows-1252 -t utf-8 win1252\_file > utf8\_file


Du skal nok kunne gøre det samme på Windows med cygwin.

Andre referencer 4


Hvis du er IKKE på Ruby 1.9, og hvis du antager yhager's kommando fungerer, kan du prøve


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