Кодирование кодовых точек Unicode с помощью Ruby - PullRequest
1 голос
/ 08 января 2012

Я получаю HTML-документ, который анализируется с помощью Nokogiri.HTML использует кодировку ISO-8859-1.Проблема в том, что в документе есть некоторые символы Unicode, которые конвертируются в кодовые точки Unicode вместо их соответствующих символов.

Например, это некоторый текст в HTML в том виде, в котором он был получен (в ISO-8859-1):

\x95\x95 JOHNNY VENETTI \x95\x95

И при попытке работать с этим текстом он преобразуется в следующее:

\u0095\u0095 JOHNNY VENETTI \u0095\u0095

Итак, мой вопрос, как я могу гарантировать, что эти символы представлены как соответствующиесимвол вместо кодовой точки?Я попытался сделать gsub для текста, но это кажется неправильным для этого.Кроме того, я не могу контролировать кодировку HTML-документа.

1 Ответ

3 голосов
/ 08 января 2012

Сначала вы должны понимать, что эта строка НЕ ISO-8859-1 (file говорит "Non-ISO extended-ASCII text" и кодовая страница подтверждает это). Вполне возможно, что это ваша проблема, в этом случае вы должны указать правильную кодировку (вероятно, что-то вроде Windows-1252 , в данном случае) в вашем HTML-документе.

В Nokogiri вы также можете явно указать кодировку в тех случаях, когда в документе указана неправильная кодировка:

Nokogiri.HTML("<p>\x95\x95 JOHNNY VENETTI \x95\x95</p>", nil, "Windows-1252")
# => #<Nokogiri::HTML::Document: ... 
#       children=[#<Nokogiri::XML::Text:0x15744cc "•• JOHNNY VENETTI ••">]>]>]>]>

Если у вас нет возможности решить это чисто, как описано выше, вы также можете сделать это трудным путем и связать строку с ее правильной кодировкой:

s = "\x95\x95 JOHNNY VENETTI \x95\x95"
s.encoding # => #<Encoding:ASCII-8BIT>
s.force_encoding 'Windows-1252'
s.encode! 'utf-8'
s # => "•• JOHNNY VENETTI ••"

Обратите внимание, что этот последний фрагмент кода является только Ruby 1.9. Если хотите, вы можете прочитать подробнее о новой системе кодирования в Ruby 1.9 .

...