’Превращается в« \ u0092 »nokogiri в ruby ​​на рельсах - PullRequest
8 голосов
/ 11 августа 2011

У меня есть html-страница, которая имеет следующую строку с некоторыми html-сущностями, такими как "'".

#Here I am not pasting whole html page content. just putting issue line only
html_file = "<html>....<body><p>they&#146;re originally intended to describe the spread of of viral diseases, but they&amp;#146;re nice analogies for how web/SN apps grow.<p> ...</body></html>"


doc   = Nokogiri::HTML(html)
body  = doc.xpath('//body')
body_content = body[0].inner_html

puts body_content  

Результат:

These terms come from the fields of medicine and biology  they\u0092re originally intended to describe the spread of of viral diseases, but they\u0092re nice analogies for how web/SN apps grow.

Я хочу оставить эти сущности такими, какие они естьизменить его на Unicode.Что-нибудь, я скучаю?

Спасибо

Ответы [ 2 ]

11 голосов
/ 29 сентября 2011
they&#146;re

неверно и его следует избегать. Если вы хотите использовать закрывающую одинарную кавычку, чтобы воспроизвести типографскую практику рендеринга апострофов в виде наклонной кавычки, то правильный символ - это U + 2019 ПРАВИЛЬНАЯ ОДНОКВАЖНАЯ КАРТА, которая может быть записана как &#x2019; или &#8217;. Или, если вы используете UTF-8, просто дословно включите как .

&#146; должен относиться к символу U + 0092, мало используемому и бессмысленному управляющему символу, который обычно отображается как пустое поле или поле с отсутствующим глифом. И действительно, в XML это так.

Но в HTML (кроме XHTML, в котором используются правила XML), существует давняя странная хитрость браузера, заключающаяся в том, что ссылки на символы в диапазоне от &#128; до &#159; неверно интерпретируются как обозначение символов, связанных с байтами от 128 до 159 в кодовая страница Windows Western (cp1252) вместо символов Unicode с этими кодовыми точками. Наконец, стандарт HTML5 документирует это поведение.

Проблема в том, что Нокогири не знает об этой причуде и берет в своем слове ссылку на символ 146, заканчивающуюся символом 146 (\u0092), который вам на самом деле не нужен. Я думаю, что Nokogiri использует libxml2 для разбора HTML, поэтому в конечном итоге правильным решением будет функция htmlParseCharRef в libxml2 для замены символов 128–159.

Тем временем вы, возможно, могли бы попытаться «исправить» ссылки на символы вручную с помощью грубой подстановки строк, такой как &#146; -> &#x2019; перед синтаксическим анализом. Это немного неправильно, но, по крайней мере, в HTML единственное место, где вы можете иметь последовательность разметки &#146; без ссылки на символы, будет в комментарии, так что, надеюсь, это не будет иметь значения, если вы тоже случайно изменили содержимое там .

1 голос
/ 25 августа 2011

Вы пытались изменить

&amp;#146;

на

&#146;

Я думаю, что анализатор сначала анализирует амперсанд, затем объединяет его с "# 146", а затем анализирует их обоих.хотя это просто мнение .. Я хочу, чтобы это был просто комментарий IDK how..lol

Ну, я понял идею из focos в его ответном сообщении здесь , и Unicode от здесь .

...