- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在处理从遗留数据库导入 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、...);不幸的是,由于编码重叠,因此没有可靠的方法来区分差异,并且如果不目测结果并了解所涉及的各种语言,就无法确定什么结果有意义。
可能你能做的最好的事情是:
CGI::unescape_html(CGI::unescape(...))
转换器发送所有内容。请注意,我使用的是 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/
我正在处理从遗留数据库导入 sqlite 的数据以进行开发,遗留数据库有很多带有波兰字符的 url 编码字符串。我可以通过使用 使这些字符串中的大部分变得可读 CGI::unescape_html(
我是一名优秀的程序员,十分优秀!