什么是Perl的“标准字符串比较顺序”?

前端之家收集整理的这篇文章主要介绍了什么是Perl的“标准字符串比较顺序”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这真的是一个双重问题,我的两个最终目标有答案:

>什么是标准字符串比较顺序,在力学方面?
>这是一个更好的名字,所以我可以更新文档?

Perl的文档sort表示,没有块,排序使用“标准字符串比较顺序”。但是那个订单是什么呢?应该有一个更好的名字。对于这个问题,我特别指的是locale没有生效的情况,因为它定义了自己的秩序。

在过去的几年中,我们通常称之为“ASCIIb”的标准排序顺序。它在Learning Perl和许多其他书。但是,这个词是过时的。自5.6以来,Perl已经具有Unicode感知能力。谈论ASCII是老派。既然Perl也是Unicode感知,它知道字符串。在sv.c中,Perl_sv_cmp了解locale,bytes和UTF-8。前两个很容易。但我对第三个人没有信心。

/*
=for apidoc sv_cmp

Compares the strings in two SVs.  Returns -1,or 1 indicating whether the
string in C<sv1> is less than,equal to,or greater than the string in
C<sv2>. Is UTF-8 and 'use bytes' aware,handles get magic,and will
coerce its args to strings if necessary.  See also C<sv_cmp_locale>.

=cut
*/

当Perl使用UTF-8排序时,真正排序什么?字符串编码的字节,它代表的字符(包括标记可能?)还是别的?我认为这是sv.c中的相关行(第6698行提交7844ec1):

pv1 = tpv = (char*)bytes_to_utf8((const U8*)pv1,&cur1);

如果我正在阅读(使用我生锈的C),pv1被胁迫到八位字节,变成UTF-8,然后强制到字符(在C意义上)。我认为这意味着它是通过UTF-8编码进行排序(即UTF-8用于表示代码点的实际字节)。另一种说法就是它不排字符。我想我几乎相信自己正在阅读这个权利,但是有些人比我更了解这一点。

因此,下一个有趣的行是6708:

const I32 retval = memcmp((const void*)pv1,(const void*)pv2,cur1 < cur2 ? cur1 : cur2);

对我来说,看起来像一个pv1和pv2,被强制为char *,现在只是比较逐字节,因为它们被强制为void *。 memcmp会发生什么,看起来它只是根据我读到的各种文档比较位?再次,我想知道我在字节 – > utf8->字符 – 字节的行程中缺少什么,就像可能是Unicode归一化步骤一样。检查utf8.c中的Perl_bytes_to_utf8没有帮助我回答这个问题。

作为旁注,我想知道这是否与Unicode Collation Algorithm相同?如果是,为什么Unicode::Collate存在?从它的外观,我不认为Perl的排序处理规范的等价。

解决方法

UTF-8具有根据字节值对UTF-8字符串逐字节排序的属性,给出了按照编码点编号对代码点编码进行排序的顺序。也就是说,我不知道U 2345的UTF-8表示在U 1234的UTF-8表示之后是字典。

对于正常化,Perl核心不知道什么;要在不同形式之间进行准确的排序和比较,您将希望通过Unicode::Normalize运行所有的字符串,并将它们全部转换为相同的规范化形式。我不能评论哪个是最适合任何特定的目的,主要是因为我没有线索。

此外,排序和cmp如果正在使用,则受区域编译指示的影响;它使用POSIX归类顺序。使用区域设置,8位区域设置和unicode都是灾难的一个方法,但使用区域设置,UTF-8区域设置和unicode应该有效地工作。我不能说我已经试过了。无论如何,perllocaleperlunicode有很多信息。

猜你在找的Perl相关文章