Unicode规范化在strcoll中的应用

3
有些时候,Unicode字符串在规范意义下等效,但在排序时可能并不相等。
#include <iostream>
#include <cstring>
#include <clocale>
int main()
{
    std::setlocale(LC_COLLATE, "en_US.UTF-8");
    if (std::strcoll("\xc3\xa9", "e\xcc\x81"))
      std::cout << "FAIL: No Unicode normalization here" << std::endl;
    else
      std::cout << "WIN: Unicode normalization is performed" << std::endl;
}

这个程序在我使用Cygwin模拟的Windows机器上运行成功,但在我手头能获取到的每台Linux系统上都失败了。

这是预期行为吗?有哪些Linux系统可以成功运行呢?Mac OS X和FreeBSD呢?

我知道我可以使用第三方库对其进行规范化和规范等价处理。我关心的是UTF-8语言环境下的标准排序规则。

这个问题的灵感来源于这个问题

1个回答

1
据我所知,在C、C++和POSIX标准中都没有提到Unicode规范化。
因此,实现可能会将规范化留给程序员显式完成。
更具体地说,在glibc欧洲区域设置中,似乎使用ISO 14651作为排序算法。Unicode排序FAQ 暗示ISO 14651不执行规范化: 规范等价的统一处理 是UCA和ISO 14651之间的差异之一。

两个标准都没有提到 *.UTF-8 区域设置。语言标准提到了 C 区域设置,POSIX 添加了 POSIX 区域设置。我对 *.UTF-8 区域设置感兴趣,是的,我指的是特定于实现的区域设置。 - n. m.
那么你只能得到与实现相关的答案,这些答案是不可靠的。无论如何,我期望C/Unix-y行为不会隐式地进行规范化。 - ninjalj
一个特定于实现的问题需要一个特定于实现的答案。它明确地提到了“linux”、“cygwin”和“en_US.UTF-8”。这些都是特定于实现的东西。我不认为有什么问题。 - n. m.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接