【问题标题】:Unicode %uXXXX encoding/decoding XS module in PerlPerl 中的 Unicode %uXXXX 编码/解码 XS 模块
【发布时间】:2012-02-14 02:59:40
【问题描述】:

是否有任何带有高速子例程的 Perl XS 模块适用于对 unicode cookie(尤其是 Firefox)中的非标准 %uXXXX unicode 字符进行编码/解码?

解码:输入 = ...%uXXXX...,输出 = 一个普通的 utf8 Perl 字符串
编码:输入 = 一个普通的 utf8 Perl 字符串,输出 = ...%uXXXX...

现在我正在使用以下代码解码这些字符串:

    $string =~ s/%u([A-Fa-f0-9]{4})/chr(hex($1))/eg;

但最好有一个 C 实现的版本。

【问题讨论】:

    标签: perl unicode encoding


    【解决方案1】:

    这种特定格式本身与 cookie 无关,但它是应用于 cookie 的一种常见的 ad-hoc 编码形式。它由 JavaScript 函数escape() 生成。它看起来很像 URL 编码,但不兼容; JS 作者真的需要停止使用它。

    URI::Escape::JavaScript 有一个重现unescape 算法的实现。它与您的方法基本相同,但也处理两位数的%xx 模式。

    试图将 JS 转义编码视为 URL 编码扩展的模块可能会因+ 字符的潜在不同处理而绊倒。

    我怀疑任何应用程序都会花费足够多的时间来解码这些,以使其值得在 C 中进行,真的。

    【讨论】:

    • 是的,我知道这不仅仅与 cookie 有关。问题是 Firefox 喜欢使用这种编码(Chrome 直接将 unicode 编码为转义字节)。在我的例子中,两位 %xx 代码由 Apache::Cookie::fetch() 自动解码,所以我必须处理 %uxxxx 的情况。无论如何,感谢您的留言和分享经验。
    • Firefox 不会自行对 cookie 进行转义,只有在显式调用 escape() 时(与其他浏览器一样)。尝试在 cookie 中包含原始的非 ASCII 字符只会中断,而不是转义。尽管如此,如果您使用标准的 URL 解码器来处理您的 %xx 序列,您可能会得到与 U+0080–U+009F 范围内的字符不一致的结果(因为 URL 解码器会将它们变成 UTF-8 -encoded,但escape() 在此处生成 ISO-8859-1 编码字节)和+ 问题。
    • 好吧,当然我做错的可能性很高,但至少 Firefox 和 Chrome 对 cookie 名称和值中的 unicode 处理不同(也许在其他地方也是如此)。 escape() 可能在幕后被调用,但 Firebug/Firecookie 和“控制台”使用 %uxxxx 编码 unicode。我在这里谈论的是默认行为,而显式 encodeURI() 会生成标准的百分比编码代码。
    • 测试用例?设置document.cookie='foo=a\u0101b'(或通过Set-Cookie)然后读取document.cookie 不会在Firefox 或Chrome 中应用任何%u 编码。它们对非 ASCII 字符的处理存在差异,目前 cookie 中的非 ASCII 字符在任何跨浏览器上下文中基本上都不可用,但两者都没有触及escape()。 (特别是:Chrome 和 Opera 解释为 UTF-8;Firefox 对每个字符使用 UTF-16 代码单元的最低有效字节;IE 使用 ANSI 代码页;Safari 拒绝完全设置 cookie。)
    【解决方案2】:

    两个怎么样?


    URL::Encode::XS也存在,但不符合要求。

    【讨论】:

    • 谢谢,这似乎是所需要的。我正在寻找 URI::Escape,但在文档中没有找到关于 %uxxxx 编码的信息。 XS版似乎更高级。我将对其进行测试/基准测试,我很快就会将此问题标记为已回答。同时,如果有的话,也有人可以添加其他模块。再次感谢您。
    • 嗯,URI::Escape::XS 模块正在根据需要进行编码/解码,但不幸的是它的运行速度比纯 Perl 正则表达式替换慢 10 倍。
    猜你喜欢
    • 2021-06-01
    • 2011-02-09
    • 1970-01-01
    • 2023-03-29
    • 2011-11-26
    • 2015-09-19
    • 2019-12-19
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多