来自先前十六进制编码的 Ruby 编码

Ruby Encoding from Previous Hex Encoding

提问人:Rich_F 提问时间:3/22/2022 最后编辑:Rich_F 更新时间:3/22/2022 访问量:64

问:

我遇到过结果编码到我的结果中的情况。问题在于结果的实际编码是 ,但包含十六进制字符:NokogirihexUTF-8

Best 100+ Fishing Pictures | Download Free Images on Unsplash
https%3A%2F%2Funsplash.com%2Fs%2Fphotos%2Ffishing&rut=d1dd8233a6ad628121fa36d8d5a51be0b6fb0eda75e234d5036bf7b49efcf25b
current encoding: UTF-8

Fish Images | Free Vectors, Stock Photos & PSD
https%3A%2F%2Fwww.freepik.com%2Ffree%2Dphotos%2Dvectors%2Ffish&rut=f68a290a96893c63f8849bc9e89152d97a632d7a95bbf5d0ca2e939b378fff68
current encoding: UTF-8

How to Use Fish vs. fishes Correctly
https%3A%2F%2Fgrammarist.com%2Fusage%2Ffish%2Dfishes%2F&rut=e0897e219c9b0b125a1442b59e36c49753417a1b7812ae9d3ab0bc3179ffe6b5
current encoding: UTF-8

URL 在技术上编码为 ,但具有十六进制字符。我没有找到任何将它们视为十六进制来翻译的东西,所以我不知道如何识别这些字符分组进行翻译。除了编写一个可能有效的复杂方法之外,我想我会看看是否有对原始字符串的强制识别,然后使用或类似的东西进行翻译。UTF-8UTF-8force_encode

有人对如何做到这一点有任何建议吗?任何见解都值得赞赏。我宁愿避免将这些字符手动编码到方法中。

更新:不起作用:CGI::unescapeHTML(<string>]

irb(main):024:0> a
=> "https%3A%2F%2Fwww.freepik.com%2Ffree%2Dphotos%2Dvectors%2Ffish&rut=f68a290a96893c63f8849bc9e89152d97a632d7a95bbf5d0ca2e939b378fff68"
irb(main):025:0> CGI::unescapeHTML(a)
=> "https%3A%2F%2Fwww.freepik.com%2Ffree%2Dphotos%2Dvectors%2Ffish&rut=f68a290a96893c63f8849bc9e89152d97a632d7a95bbf5d0ca2e939b378fff68"
irb(main):026:0> CGI::unescapeHTML(a) == a
=> true
Ruby 编码 UTF-8 十六进制

评论

1赞 Jad 3/22/2022
ruby-doc.org/stdlib-2.5.1/libdoc/cgi/rdoc/CGI/......这有什么帮助吗?
0赞 Rich_F 3/22/2022
不。更新了 OP。
0赞 voxobscuro 3/22/2022
我认为,如果您提供一个代码片段来重现问题而不仅仅是脚本的输出,那将会很有帮助。
0赞 Rich_F 3/22/2022
@voxobscuro更新的第三行。否则我找不到任何有效的东西。所以没有什么可真正发布的。
3赞 Jörg W Mittag 3/22/2022
字符串不是 HTML 转义的,而是 URI 转义的。尝试 Jad 评论中链接的方法。不过,您正在修复症状,而不是根本原因。首先,您需要弄清楚为什么字符串被错误地转义,而不是如何撤消本来就不应该做的事情。

答:

1赞 voxobscuro 3/22/2022 #1

您没有在原始问题中提供“结果编码为 UTF-8,但包含十六进制字符”的来源。我想我不明白这个问题。

在更新中,您使用了不正确的方法。 用于解析 HTML 实体:unescapeHTML

irb(main):010:0> CGI.escapeHTML '<'
=> "&lt;"
irb(main):012:0> CGI.unescapeHTML '&lt;'
=> "<"

您需要使用的方法是解码 URL 序列:

irb(main):017:0> encoded_url = "https%3A%2F%2Fwww.freepik.com%2Ffree%2Dphotos%2Dvectors%2Ffish&rut=f68a290a96893c63f8849bc9e89152d97a632d7a95bbf5d0ca2e939b378fff68"
=> "https%3A%2F%2Fwww.freepik.com%2Ffree%2Dphotos%2Dvectors%2Ffish&rut=f68a290a96893c63f8849bc9e89152d97a632d7a95bbf5d0ca2e939b378fff68"
irb(main):018:0> CGI.unescape encoded_url
=> "https://www.freepik.com/free-photos-vectors/fish&rut=f68a290a96893c63f8849bc9e89152d97a632d7a95bbf5d0ca2e939b378fff68"

如果这不能解决您的实际问题,我很乐意在问题中提供更易于调试的源代码进行修改。

评论

0赞 Rich_F 3/22/2022
使用 ,正确。我试过了,这是不正确的。CGI.unescapeCGI.unescapeHTML