Равно ли сопоставляют канонически эквивалентные строки Юникода? Иногда.
#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 FAIL в каждой системе Linux, в которую я могу попасть.
Это ожидаемое поведение? Существуют ли системы Linux, которые выдают WIN? А как насчет Mac OS X? FreeBSD?
Я знаю, что могу нормализовать и сделать каноническую эквивалентность со сторонними библиотеками. Я заинтересован в стандартных правилах сопоставления локалей UTF-8.
Этот вопрос вдохновлен этот.
Насколько мне известно, ни в C, ни в C ++, ни в стандартах POSIX нет упоминаний о нормализации Unicode.
Поэтому реализации могут оставить нормализацию как нечто, что должно быть сделано явно программистом.
Более точно, в европейских языковых стандартах glibc очевидно используют ISO 14651 в качестве алгоритма сопоставления. Unicode Collation FAQ подразумевает, что ISO 14651 не выполняет нормализацию: единообразная обработка канонических эквивалентов указан как разница между UCA и ISO 14651.
Других решений пока нет …