Часто задаваемые вопросы несколько вводят в заблуждение, начиная с использования «должен», за которым следует непоследовательное использование «требования» об одном и том же. Сам стандарт Unicode (цитируется в FAQ) является более точным. По сути, вы не должны ожидать, что программы будут рассматривать канонически эквивалентные строки как разные, но вы также не должны ожидать, что все программы будут рассматривать их как идентичные.
На практике это действительно зависит от того, что нужно вашему программному обеспечению. В большинстве случаев нормализация вообще не требуется, а нормализация может уничтожить важную информацию в данных.
Например, U+0387 ГРЕЧЕСКИЙ АНО ТЕЛЕЯ (·) определяется как канонический эквивалент U+00B7 СРЕДНЯЯ ТОЧКА (·). Это было ошибкой, так как символы действительно отличаются друг от друга и должны отображаться по-разному и обрабатываться по-разному. Но уже слишком поздно это менять, так как эта часть Unicode высечена в камне. Следовательно, если вы конвертируете данные в NFC или иным образом отбрасываете различия между канонически эквивалентными строками, вы рискуете получить неправильные символы.
Если вы не выполняете нормализацию, вы рискуете. Например, буква «ä» может отображаться как один символ Юникода U+00E4 СТРОЧНАЯ ЛАТИНСКАЯ БУКВА A С ДИЭРЕЗИСОМ или как два символа Юникода U+0061 СТРОЧНАЯ ЛАТИНСКАЯ БУКВА A U+0308 КОМБИНИРОВАНИЕ ДИЭРЕЗИСА. В основном это будет первая, то есть предварительно составленная форма, но если это последняя, и ваш код проверяет данные, содержащие «ä», используя только предварительно составленную форму, то он не обнаружит последнюю. Но во многих случаях вы не делаете таких вещей, а просто сохраняете данные, объединяете строки, печатаете их и т. д. Тогда есть риск, что два представления приведут к несколько разным рендерингам.
Также имеет значение, передает ли ваше программное обеспечение данные о символах другому программному обеспечению. Получатель может ожидать, из-за наивных неявных предположений или сознательно и задокументированным образом, что его ввод нормализуется.
person
Jukka K. Korpela
schedule
13.04.2013