Unicode字符默认排序规则表

Tai*_*air 2 postgresql unicode rhel collation

我不知道这个问题到底属于哪个网站,所以发布在这里。

\n\n

我在 RHEL 6.4 上使用 Postgresql 9.2 并观察到以下内容:

\n\n
select foo \nfrom unnest(\'{\xd0\xb0,\xd3\x99,\xd0\xb1,\xd0\xb2,\xd0\xb3,\xd0\xb4,\xd0\xb5,\xd0\xb6}\'::text[]) as foo \norder by foo collate "kk_KZ.utf8"\n
Run Code Online (Sandbox Code Playgroud)\n\n

给出

\n\n
\xd0\xb0\n\xd3\x99\n\xd0\xb1\n\xd0\xb2\n\xd0\xb3\n\xd0\xb4\n\xd0\xb5\n\xd0\xb6\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
select foo \nfrom unnest(\'{\xd0\xb0,\xd3\x99,\xd0\xb1,\xd0\xb2,\xd0\xb3,\xd0\xb4,\xd0\xb5,\xd0\xb6}\'::text[]) as foo \norder by foo collate "en_US.utf8"\n
Run Code Online (Sandbox Code Playgroud)\n\n

给出

\n\n
\xd0\xb0\n\xd0\xb1\n\xd0\xb2\n\xd0\xb3\n\xd0\xb4\n\xd0\xb5\n\xd3\x99 -- misplaced\n\xd0\xb6\n
Run Code Online (Sandbox Code Playgroud)\n\n

此外,我发现有默认 Unicode 排序规则元素表 [1],其中以正确的顺序列出了有问题的字符 (04D9 ; [.199D.0020.0002.04D9] # CYRILLIC SMALL LETTER SCHWA)。

\n\n

我知道期望“en_US.utf8”语言环境正确处理西里尔字符是愚蠢的,但是在字符通常不属于所使用的语言/语言环境的情况下,Unicode 或任何其他相关标准的正确行为是什么用于整理?

\n\n

[1] http://www.unicode.org/Public/UCA/latest/allkeys.txt

\n

Den*_*rdy 6

它并没有放错地方。这可能适合你,但不适合我。:-) 严肃地说,Unicode 没有正确的行为;根本不可能。字符集是一种映射;排序规则是一组特定于语言环境的规则,用于对该集中的字符进行排序 - 即使在同一语言环境中也可以有多种排序规则。

\n

如果你好奇的话,ICU 文档中有很多关于此类事情如何棘手的例子。广泛引用:

\n

http://userguide.icu-project.org/collat​​ion

\n
\n

[H]以下是语言在排序字符串方面的一些变化方式:

\n

字母 AZ 的排序顺序与英语不同。例如,在立陶宛语中,“y”在“i”和“k”之间排序。

\n

字母的组合可以被视为一个字母。例如,在传统西班牙语中,“ch”被视为单个字母,并在“c”和“d”之间排序。

\n

重音字母可以被视为非重音字母的较小变体。例如,“\xc3\xa9”可以被视为等同于“e”。

\n

重音字母可以被视为不同的字母。例如,丹麦语中的“\xc3\x85”被视为紧随“Z”之后的单独字母。

\n

在一种语言中被认为是独特的非重音字母在另一种语言中可能是模糊的。例如,字母“v”和“w”根据英语是两个不同的字母。然而,“v”和“w”被认为是瑞典语中同一字母的变体形式。

\n

一个字母可以被视为两个字母。例如,在传统德语中,“\xc3\xa4”就像“ae”一样进行比较。

\n

泰语要求某些字母的顺序颠倒。

\n

法语要求在字符串末尾按重音排序的字母要排在字符串开头的重音之前。例如,单词“c\xc3\xb4te”排序在“cot\xc3\xa9”之前,因为最后的“e”上的尖音符比“o”上的抑扬符更重要。

\n

有时小写字母排在大写字母之前。其他情况则需要相反的情况。例如,在英语中,小写字母通常排在大写字母之前。拉脱维亚语字母正好相反。

\n

即使使用相同的语言,不同的应用程序也可能需要不同的排序顺序。例如,在德语词典中,“\xc3\xb6f”将出现在“of”之前。在电话簿中,情况恰恰相反。

\n

由于政府法规或 Unicode 中的新字符/脚本,排序顺序可能会随着时间而变化。

\n
\n