\ x {..}和\ N {U + ..}之间有区别吗

Haf*_*ger 2 perl

在打印声明中使用\x{..}\N{U+..}在打印声明中有区别吗?对我来说,它们看起来像做同一件事的两种方式。那么有什么区别-如果有的话?

ike*_*ami 6

"\x{...}"并且"\N{U+...}"始终产生完全相同的字符串,意思"\x{...}" eq "\N{U+...}"将始终为true(对于相同的数字)。

但是,从5.12开始,"\N{U+...}"可以保证by创建的标量使用UTF8=1内部存储格式[1],而by创建的标量"\x{...}"则不受任何保证(并且实际上UTF8=0在可能的情况下使用该格式)。这意味着utf8::upgrade在将标量"\N{U+...}"传递给遭受Unicode错误的(内置或XS)函数之前,不需要在标量上调用它。[2]

简而言之,"\N{U+...}"在处理Unicode代码点时"\x{...}"更可能正确工作,而在处理字节时则更可能正确工作。


  1. 所述UTF8=0的8位字符的存储格式的支持绳构成,同时UTF8=1的32位或64位的字符存储格式支持字符串(取决于版本)。

  2. 这是指将两个相同的字符串视为不同的代码,因为一个字符串是使用UTF8=0格式存储的,而另一个是使用UTF8=1格式存储的。将语义分配给存储格式的代码是有问题的,因为Perl可以而且确实可以在两种格式之间自由转换字符串。