Как использовать символы Unicode с Nokogiri::XML::DocumentFragment

Я хочу использовать символ Unicode с Nokogiri::XML::DocumentFragment.

frag = Nokogiri::XML::DocumentFragment.parse("<foo>ü</foo>")
=> <foo>&#xFC;</foo>

Символ Юникода экранирован. Мне нужно установить encoding: 'UTF-8', чтобы получить читаемый символ.

frag.to_html(encoding: 'UTF-8')
=> "<foo>ü</foo>"

Есть ли возможность кодирования при разборе строки?

Nokogiri::HTML::DocumentFragment.parse обработайте строку так, как я ожидал, но мне нужно использовать XML.

frag = Nokogiri::HTML::DocumentFragment.parse("<foo>ü</foo>")
=> <foo>ü</foo>

🤔 А знаете ли вы, что...
Ruby обеспечивает поддержку регулярных выражений с помощью класса 'Regexp'.


20
1

Ответ:

Решено

Согласно документации здесь текст уже хранится внутри как UTF-8.

Strings are always stored as UTF-8 internally. Methods that return text values will always return UTF-8 encoded strings. Methods that return XML (like to_xml, to_html and inner_html) will return a string encoded like the source document.

Поэтому, если вы вызовете, например, #text на своем frag вместо того, чтобы печатать весь объект frag, вы увидите, что ü напечатан правильно

puts frag.text
# => ü

В противном случае вы можете использовать #XML вместо #DocumentFragment напрямую и явно передать кодировку.

doc = Nokogiri.XML('<foo>ü</foo>', nil, 'UTF-8')
puts doc

# => <?xml version = "1.0" encoding = "UTF-8"?>
# => <foo>ü</foo>