Unicode%uxxx编码/解码Perl中的XS模块

Unicode%uxxx编码/解码Perl中的XS模块,perl,unicode,encoding,Perl,Unicode,Encoding,是否有任何带有高速子例程的Perl XS模块适合对unicode Cookie(尤其是Firefox)中的非标准%uxxx unicode字符进行编码/解码 解码:输入=…%uxxx,输出=正常的utf8 Perl字符串 编码:输入=一个普通的utf8 Perl字符串,输出=…%uxxx 现在我使用以下代码解码这些字符串: $string =~ s/%u([A-Fa-f0-9]{4})/chr(hex($1))/eg; 但是如果有一个C实现的版本就好了 两个怎么样 也存在,但

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

解码:输入=…%uxxx,输出=正常的utf8 Perl字符串
编码:输入=一个普通的utf8 Perl字符串,输出=…%uxxx

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

    $string =~ s/%u([A-Fa-f0-9]{4})/chr(hex($1))/eg;
但是如果有一个C实现的版本就好了

两个怎么样


也存在,但不符合要求。

两个怎么样



也存在,但不符合要求。

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

具有复制
unescape
算法的实现。它基本上与您的方法相同,但也处理两位数的
%xx
模式

试图将JS转义编码视为URL编码的扩展的模块很可能会在处理
+
字符时出错


我怀疑任何应用程序都不会花费足够的时间来解码这些内容,从而使其真正值得在C语言中使用。

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

具有复制
unescape
算法的实现。它基本上与您的方法相同,但也处理两位数的
%xx
模式

试图将JS转义编码视为URL编码的扩展的模块很可能会在处理
+
字符时出错


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

谢谢,这似乎是必需的。我正在查找URI::Escape,但在文档中没有找到关于%uxxx编码的信息。XS版本似乎更高级。我将对其进行测试/基准测试,我很快会将此问题标记为已回答。同时,如果有的话,也可以添加其他模块。再次感谢。URI::Escape::XS模块正在按要求进行编码/解码,但不幸的是,它的运行速度比纯Perl正则表达式替换慢10倍。谢谢,这似乎是必需的。我正在查找URI::Escape,但在文档中没有找到关于%uxxx编码的信息。XS版本似乎更高级。我将对其进行测试/基准测试,我很快会将此问题标记为已回答。同时,如果有的话,也可以添加其他模块。再次感谢。好的,URI::Escape::XS模块正在按要求进行编码/解码,但不幸的是,它的运行速度比纯Perl正则表达式替换慢10倍。是的,我知道它不仅仅与cookie有关。问题是Firefox喜欢使用这种编码(Chrome直接将unicode编码为转义字节)。在我的例子中,两位数的%xx代码由Apache::Cookie::fetch()自动解码,因此我必须处理%uxxx情况。无论如何,我感谢您的留言和分享经验。Firefox不会单独在Cookie上转义,只有在显式调用
escape()
时(与其他浏览器一样)。尝试在cookie中包含原始非ASCII字符只会中断,而不会转义。尽管如此,如果您使用标准URL解码器来处理
%xx
序列,您可能会得到与U+0080–U+009F范围内的字符不一致的结果(因为URL解码器将这些字符进行UTF-8编码,但
escape()
在此处生成ISO-8859-1编码字节),以及
+
问题,当然,我犯smth错误的几率很高,但至少Firefox和Chrome在cookie名称和值中对待unicode的方式不同(在其他地方也可能如此)。可能在幕后调用了
escape()
,但是Firebug/Firecookie和“控制台”使用
%uxxx
对unicode进行编码。我在这里讨论的是默认行为,而显式的
encodeURI()
生成标准百分比编码的代码。测试用例?设置
document.cookie='foo=a\u0101b'
(或通过
设置cookie
)然后读取
文档。cookie
返回不会在Firefox或Chrome中应用任何
%u
编码。它们对非ASCII字符的处理存在差异,现有的cookie中的非ASCII字符在任何跨浏览器上下文中基本上都是不可用的,但两者都不涉及
escape()
。(特别是:Chrome和Opera将其解释为UTF-8;Firefox对每个字符使用UTF-16代码单元的最低有效字节;IE使用ANSI代码页;Safari拒绝完全设置cookie。)是的,我知道这不仅仅与cookie有关。问题是Firefox喜欢使用这种编码(Chrome直接将unicode编码为转义字节)。在我的例子中,两位数的%xx代码由Apache::Cookie::fetch()自动解码,因此我必须处理%uxxx情况。无论如何,我感谢您的留言和分享经验。Firefox不会单独在Cookie上转义,只有在显式调用
escape()
时(与其他浏览器一样)。尝试在cookie中包含原始非ASCII字符只会中断,而不会转义。尽管如此,如果您使用标准URL解码器来处理
%xx
序列,您可能会得到与范围U+0080–U+009F中的字符不一致的结果(因为URL解码器会将它们设置为UTF)