gpt4 book ai didi

html - `CGI.unescapeHTML` 的不完整性

转载 作者:数据小太阳 更新时间:2023-10-29 08:04:18 28 4
gpt4 key购买 nike

CGI.unescapeHTML似乎对无法用 HTML 字面表达的字符进行转义,例如 "<" , 在 HTML 中转义为 "&lt;" :

require "cgi"
CGI.unescapeHTML("&lt;") # => "<"

但是对于既可以按字面意思表示又可以不按字面意思表示的字符,似乎也没有unescape的意思。例如,"§"也可以用 HTML 表示为 "&sect;" , 而后者不是通过这种方法逃脱的:

CGI.unescape("&sect;") # => "&sect;"
  1. 这是一项功能吗?有什么办法可以完全取消转义包含这些字符的 HTML 字符串吗?
  2. 我可以找到关于 CGI.escapeHTML 的描述, CGI.unescapeHTML在 RDoc 中为 Ruby 1.9.3 ,但我找不到最新的 Ruby。他们怎么了?它们是否被描述过,或者这些方法有任何变化?

最佳答案

您将在 CGI::Util 中找到更新的 Ruby 版本的文档。 CGI::Util 还定义了一个包含特殊字符及其转义值的常量。该列表非常短:

> CGI::Util::TABLE_FOR_ESCAPE_HTML__
{
"'" => "&#39;",
"&" => "&amp;",
"\"" => "&quot;",
"<" => "&lt;",
">" => "&gt;"
}

查看 unescapeHTML 的实现,您会根据字符串的字符集发现更多替换:

# File lib/cgi/util.rb, line 43
def unescapeHTML(string)
return string unless string.include? '&'
enc = string.encoding
if enc != Encoding::UTF_8 && [Encoding::UTF_16BE, Encoding::UTF_16LE, Encoding::UTF_32BE, Encoding::UTF_32LE].include?(enc)
return string.gsub(Regexp.new('&(apos|amp|quot|gt|lt|#[0-9]+|#x[0-9A-Fa-f]+);'.encode(enc))) do
case $1.encode(Encoding::US_ASCII)
when 'apos' then "'".encode(enc)
when 'amp' then '&'.encode(enc)
when 'quot' then '"'.encode(enc)
when 'gt' then '>'.encode(enc)
when 'lt' then '<'.encode(enc)
when /\A#0*(\d+)\z/ then $1.to_i.chr(enc)
when /\A#x([0-9a-f]+)\z/i then $1.hex.chr(enc)
end
end
end
asciicompat = Encoding.compatible?(string, "a")
string.gsub(/&(apos|amp|quot|gt|lt|\#[0-9]+|\#[xX][0-9A-Fa-f]+);/) do
match = $1.dup
case match
when 'apos' then "'"
when 'amp' then '&'
when 'quot' then '"'
when 'gt' then '>'
when 'lt' then '<'
when /\A#0*(\d+)\z/
n = $1.to_i
if enc == Encoding::UTF_8 or
enc == Encoding::ISO_8859_1 && n < 256 or
asciicompat && n < 128
n.chr(enc)
else
"&##{$1};"
end
when /\A#x([0-9a-f]+)\z/i
n = $1.hex
if enc == Encoding::UTF_8 or
enc == Encoding::ISO_8859_1 && n < 256 or
asciicompat && n < 128
n.chr(enc)
else
"&#x#{$1};"
end
else
"&#{match};"
end
end
end

所以:是的,它只取消了一个子集。

关于html - `CGI.unescapeHTML` 的不完整性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22911266/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com