strcoll中的Unicode规范化

Unicode normalization in strcoll

本文关键字:规范化 Unicode 中的 strcoll      更新时间:2023-10-16

规范等价的Unicode字符串排序是否相等?有时

#include <iostream>
#include <cstring>
#include <clocale>
int main()
{
    std::setlocale(LC_COLLATE, "en_US.UTF-8");
    if (std::strcoll("xc3xa9", "exccx81"))
      std::cout << "FAIL: No Unicode normalization here" << std::endl;
    else
      std::cout << "WIN: Unicode normalization is performed" << std::endl;
}

这个程序在我的Cygwin化的Windows机器上获得了胜利,在我能拿到的每个Linux系统上都失败了。

这是预期的行为吗?有Linux系统可以产生WIN吗?Mac OS X呢?FreeBSD?

我知道我可以规范化并与第三方库进行规范等价。我对UTF-8语言环境的标准排序规则很感兴趣。

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

据我所知,在C、C++和POSIX标准中都没有提到Unicode规范化。

因此,实现可能会将规范化留给程序员明确地完成。

更明确地说,在油嘴滑舌的欧洲地区,显然使用ISO 14651作为排序算法。Unicode排序规则FAQ暗示ISO 14651不进行规范化:规范等价物的统一处理被列为UCA和ISO 14651之间的区别。