CGI.escapeHTML неплохой, а вот CGI.unescapeHTML полностью борется. Например:
require 'cgi'
CGI.unescapeHTML('…')
# => "…" # correct - an ellipsis
CGI.unescapeHTML('…')
# => "…" # should be "…"
CGI.unescapeHTML('¢')
# => "\242" # correct - a cent
CGI.unescapeHTML('¢')
# => "¢" # should be "\242"
CGI.escapeHTML("…")
# => "…" # should be "…"
Похоже, что unescapeHTML знает обо всех числовых кодах, плюс &, <, > и ". И escapeHTML знает только о последних четырех - он не выполняет никаких числовых кодов. Я понимаю, что экранирование обычно не должно быть таким надежным, поскольку HTML допускает буквальные версии большинства символов, кроме четырех, о которых знает CGI.escapeHTML. Но отмена побега действительно должна быть лучше.
Есть ли лучший инструмент, по крайней мере, для того, чтобы избежать побега?






require 'rubygems'
require 'hpricot'
Hpricot('…', :xhtml_strict => true).to_plain_text
Хотя, возможно, вам придется повозиться с кодировкой символов.
Используйте драгоценный камень htmlentities, а не hpricot.
Драгоценный камень htmlentities должен помочь:
require 'rubygems'
require 'htmlentities'
coder = HTMLEntities.new
coder.decode('…') # => "…"
coder.decode('…') # => "…"
coder.decode('¢') # => "¢"
coder.decode('¢') # => "¢"
coder.encode("…", :named) # => "…"
coder.encode("…", :decimal) # => "…"
Он не обрабатывает & mdash; либо.