gsub :: ArgumentError (недопустимая последовательность байтов в UTF-8) - PullRequest
2 голосов
/ 22 февраля 2012

Этот код использует гем Hpricot для получения HTML, содержащего символы UTF-8.

# <div>This is a test<a href="">测试</a></div>
div[0].to_html.gsub(/test/, "")

Когда он выполняется, он выдает эту ошибку (указывая на gsub):

ArgumentError (invalid byte sequence in UTF-8)

Как мы можем решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2012

Разобрался с проблемой.Hpricot to_html вызывает методы, которые вызывают ошибку, поэтому, чтобы избавиться от этого, нам нужно сделать документ Hpricot, кодирующий UTF-8, а не только эту строку.Мы делаем это так:

ic = Iconv.new("UTF-8//IGNORE", "UTF-8")
doc = open("http://example.com") {|f| Hpricot(ic.iconv(f.read)) }

И затем мы можем вызывать другие методы Hpricot, но теперь весь документ имеет кодировку UTF-8, и это не даст нам никаких ошибок.

0 голосов
/ 22 февраля 2012

В этом случае to_html возвращает строку не-utf8.

У меня была такая же проблема с файлом, содержащим некоторые символы не-utf8.Исправление, которое я нашел, не очень красиво, но оно также может работать для вашего случая:

the_utf8_string = the_non_utf8_string.unpack('C*').pack('U*')

Будьте осторожны, я не уверен, что ни одна потеря данных не произошла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...