Сводка : проблемные символы - это управляющие символы из ISO-8859-1, не предназначенные для отображения.
Подробности и расследование :
Вот тест, показывающий, что вы получаете действительный UTF-8 от Нокогири и Синатры:
require 'sinatra'
require 'open-uri'
get '/' do
html = open("http://flybynight.com.br/agenda.php").read
p [ html.encoding, html.valid_encoding? ]
#=> [#<Encoding:ISO-8859-1>, true]
str = html[ /Preview.+?John Digweed/ ]
p [ str, str.encoding, str.valid_encoding? ]
#=> ["Preview M/E/C/A \x96 John Digweed", #<Encoding:ISO-8859-1>, true]
utf8 = str.encode('UTF-8')
p [ utf8, utf8.encoding, utf8.valid_encoding? ]
#=> ["Preview M/E/C/A \xC2\x96 John Digweed", #<Encoding:UTF-8>, true]
require 'nokogiri'
doc = Nokogiri.HTML(html, nil, 'ISO-8859-1')
p doc.encoding
#=> "ISO-8859-1"
dig = doc.xpath("//div[@class='tit_inter_cnz']")[1]
p [ dig.text, dig.text.encoding, dig.text.valid_encoding? ]
#=> ["Preview M/E/C/A \xC2\x96 John Digweed", #<Encoding:UTF-8>, true]
<<-ENDHTML
<!DOCTYPE html>
<html><head><title>Dig it!</title></head><body>
<p>Here it comes...</p>
<p>#{dig.text}</p>
</body></html>
ENDHTML
end
Это правильно отображает содержимое с Content-Type:text/html;charset=utf-8
на моем компьютере. Однако в браузере Chrome этот символ не отображается.
Анализируя этот ответ, та же пара байтов Unicode возвращается для тире, как показано выше: \xC2\x96
. Похоже, это этот символ Unicode , который кажется странным тире.
Я бы отнес это к неверным исходным данным и просто бросил:
#encoding: UTF-8
вверху ваших исходных файлов Ruby, а затем вставьте:
f = ...text.gsub( "\xC2\x96", "-" ) # Or a better Unicode character
Редактировать : Если вы посмотрите тестовую страницу браузера для этого символа , вы увидите (по крайней мере, в Chrome и Firefox для меня), что буквенная версия UTF-8 пусто, но отображаются шестнадцатеричная и десятичная версии escape. Я не могу понять, почему это так, но у вас это есть. Браузеры просто не отображают ваш персонаж правильно, когда представлены в необработанном виде.
Либо сделайте его сущностью HTML, либо другой штрих-код Unicode. В любом случае требуется gsub
.
Редактировать # 2 : Еще одно странное замечание: символ в исходной кодировке имеет шестнадцатеричное значение байта 0x96
. Насколько я могу судить, это не печатный символ ISO-8859-1 . Как показано в официальной спецификации для ISO-8859-1 , это относится к одной из двух непечатных областей.