2013-06-10 6 views
40

Я пишу сканер, который использует Hpricot. Он загружает список строк с некоторой веб-страницы, затем я пытаюсь записать ее в файл. Что-то с кодировкой:Как преобразовать строку в UTF8 в Ruby

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

У меня есть элементы, которые отображаются на веб-странице и отпечатанные таким образом:

Développement 

в str.encoding возвращается UTF-8, так force_encoding('UTF-8') не помогает. Как я могу преобразовать это в читаемый UTF-8?

+2

Hpricot больше не поддерживается, не рекомендуется использовать Nokogiri. Кроме того, вы, вероятно, должны указать, что такое кодировка исходной веб-страницы. –

ответ

51

Ваша строка, кажется, был закодирован навыворот:

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

Он работает хорошо для большинства случаев. Но иногда: «U + 201C от UTF-8 до ISO-8859-1 в CIDEM/ACC1û ' ' U + 20AC от UTF-8 до ISO-8859-1 в инвестициях устойчивого развития Citi', т. Кроме того, некоторые имена преобразуются, но ошибочны, и я не могу засеять их в базе данных с сообщением об ошибке «неполный многобайтовый символ» – ciembor

+1

Извините, это не предназначалось для исправления. Вы должны исправить эту проблему, установив/обнаружив правильную кодировку при чтении строк в приложении. – Stefan

+0

@Stefan, отличное решение, спасибо! – gaussblurinc

37

Кажется, ваша строка думает, что это UTF-8, но на самом деле, это что-то еще, вероятно, ISO-8859-1.

Сначала определите правильную кодировку, затем преобразуйте ее в UTF-8.

В вашем примере:

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

Альтернатива:

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

Если Ã не имеет смысла, то попробуйте другую кодировку.