Нормализация Юникода в strcoll

Равно ли сопоставляют канонически эквивалентные строки Юникода? Иногда.

#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.

Этот вопрос вдохновлен этот.

3

Решение

Насколько мне известно, ни в C, ни в C ++, ни в стандартах POSIX нет упоминаний о нормализации Unicode.

Поэтому реализации могут оставить нормализацию как нечто, что должно быть сделано явно программистом.

Более точно, в европейских языковых стандартах glibc очевидно используют ISO 14651 в качестве алгоритма сопоставления. Unicode Collation FAQ подразумевает, что ISO 14651 не выполняет нормализацию: единообразная обработка канонических эквивалентов указан как разница между UCA и ISO 14651.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]