2013-06-10 23 views
40

Piszę robota, który używa Hpricot. Pobiera listę łańcuchów z jakiejś strony internetowej, a następnie próbuję zapisać ją do pliku. Coś jest nie tak z kodowaniem:Jak przekonwertować ciąg znaków na UTF8 w Ruby

"\xC3" from ASCII-8BIT to UTF-8 

Mam przedmioty, które są świadczone na stronie internetowej i drukowane w ten sposób:

Développement 

z str.encoding powraca UTF-8, więc force_encoding('UTF-8') nie pomaga. Jak mogę przekonwertować to na czytelny kodek UTF-8?

+2

Hpricot nie jest już aktualizowany, należy rozważyć użycie Nokogiri. Powinieneś również wspomnieć o kodowaniu oryginalnej strony internetowej. –

Odpowiedz

51

ciąg wydaje się być zakodowane na odwrót:

"Développement".encode("iso-8859-1").force_encoding("utf-8") 
#=> "Développement" 
+0

Działa dobrze w większości przypadków. Ale czasami: 'U + 201C z UTF-8 do ISO-8859-1 w CIDEM/ACC1Ã" ' ' U + 20AC z UTF-8 do ISO-8859-1 w Citiâ € ™ s Sustainable Development Investments' it doesn ' t. Również niektóre nazwy są konwertowane, ale niepoprawne i nie mogę wstawić ich do bazy danych z komunikatem o błędzie "niekompletny znak wielobajtowy". – ciembor

+1

Niestety, nie było to poprawką. Napraw problem, ustawiając/wykrywając poprawne kodowanie podczas odczytywania ciągów znaków w swojej aplikacji. – Stefan

+0

@Stefan, świetne rozwiązanie, dzięki! – gaussblurinc

37

Wydaje ciąg myśli, że jest UTF-8, ale w rzeczywistości jest to coś innego, prawdopodobnie ISO-8859-1.

Najpierw zdefiniuj (wymuś) odpowiednie kodowanie, a następnie przekonwertuj na UTF-8.

W przykładzie:

puts "Développement".encode('iso-8859-1').encode('utf-8') 

Alternatywą jest:

puts "\xC3".force_encoding('iso-8859-1').encode('utf-8') #-> Ã 

Jeśli à nie ma sensu, a następnie spróbuj innego kodowania.

Powiązane problemy