gpt4 book ai didi

ruby-on-rails - CGI::unescape 无法处理未转义的 "wymiana+teflon%F3w"?

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:18 24 4
gpt4 key购买 nike

我正在处理从遗留数据库导入 sqlite 的数据以进行开发,遗留数据库有很多带有波兰字符的 url 编码字符串。我可以通过使用

使这些字符串中的大部分变得可读
CGI::unescape_html( CGI::unescape "string" )

除了一个案例(我注意到了,可能还有更多,因为我还没有做任何测试),字母“ó”。例如,在字符串“wymiana+teflon%F3w”上使用 unescapeHTML 会引发 invalid byte sequence 异常。

现在的问题是我的字符串是否正确转义,因为其他波兰语字符使用的是“&#nnn;”序列像“b%26%23322%3Bad+zapisu+%2D+powinno+by%26%23263%3B+brak”,这似乎符合 numeric character referencing 的标准.顺便说一句,这个字符串被正确地转义为

"bład zapisu - powinno być brak"

但是,另一方面,也有具有相似字符编码的字符串,例如CGI::unescapeHTML 正确处理的“odpowietrzanie+weza%5C”。但是,%5C 表示 backslash不是代码点低于 U+0256 的字母。会是这个原因吗?我试图对此进行研究,但没有找到任何解释。我还将我的 Ruby 更新到 2.1.0,因为 CGI::Util 在新版本中发生了变化,但仍然没有运气。

最佳答案

ó 在 ISO-8859-2(和 ISO-8859-1)中是 0xF3 但 '\xF3' 不是有效UTF-8 字符串,如果您希望使用 UTF-8,则 ó 应该是 URL 中的 %C3%B3。某个地方的某个人可能使用了已弃用的 escape JavaScript function编码字符串而不是现代 encodeURIComponent ;您可以在浏览器的 JavaScript 控制台中通过一个简单的测试看到不同之处:

> escape('ó')
"%F3"
> encodeURIComponent('ó')
"%C3%B3"

有您正在看到的 %F3 和您想看到的 %C3%B3。应该起作用的一件事是手动修复编码:

irb> CGI::unescape('wymiana+teflon%F3w').force_encoding('ISO-8859-2').encode('UTF-8')
=> "wymiana teflonów"

这假设您知道什么应该是 ISO-8859-1 什么应该是 UTF-8。您的数据中可能混合了 ISO-8859-2(或 -1、-3、...、Windows CP-1258、...);不幸的是,由于编码重叠,因此没有可靠的方法来区分差异,并且如果不目测结果并了解所涉及的各种语言,就无法确定什么结果有意义。

可能你能做的最好的事情是:

  1. 通过您的 CGI::unescape_html(CGI::unescape(...)) 转换器发送所有内容。
  2. 将其包装在异常处理程序中以捕获不可避免的问题。
  3. 将有问题的字符串放在一边。
  4. 尝试将 (3) 中的字符串从 ISO-8859-2 转换为 UTF-8,并观察它们是否有意义。
  5. 重复使用其他常见编码,直到没有您关心的内容为止。

请注意,我使用的是 ISO-8859-2 而不是更常见的 ISO-8859-1,因为 Latin-2 适用于东欧语言(例如波兰语),而 Latin-1 适用于西欧语言。它们在 ó 上重叠,但 Latin-1 中没有 ł。对于这样的任务,您通常会首先尝试可能存在的编码,然后回退到其他常见编码,然后回退到您能想到的任何其他编码,最后回退到烈性酒。

祝你好运,对遗留数据进行现代化改造并不是世界上最有趣的工作。

关于ruby-on-rails - CGI::unescape 无法处理未转义的 "wymiana+teflon%F3w"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22647125/

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