Unicode :: Normalize - запрос о «нормализации с» - PullRequest
3 голосов
/ 21 июля 2011
#!/usr/local/bin/perl
use warnings;
use 5.014;
use Unicode::Normalize qw(NFD NFC compose);


my $string1 = "\x{f5}";

my $NFD_string1 = NFD( $string1 ); 
# PV = 0x831150 "o\314\203"\0 [UTF8 "o\x{303}"] *

my $composed_NFD_string1 = compose( $NFD_string1 ); 
#  PV = 0x77bc40 "\303\265"\0 [UTF8 "\x{f5}"] *

my $NFC_string1 = NFC( $string1 );
#  PV = 0x836e30 "\303\265"\0 [UTF8 "\x{f5}"] *


my $string2 = "o\x{303}";

my $NFD_string2 = NFD( $string2 );
#  PV = 0x780da0 "o\314\203"\0 [UTF8 "o\x{303}"] *

my $composed_NFD_string2 = compose( $NFD_string2 ); 
#  PV = 0x782dc0 "\303\265"\0 [UTF8 "\x{f5}"] *  

my $NFC_string2 = NFC( $string2 );
#  PV = 0x7acba0 "\303\265"\0 [UTF8 "\x{f5}"] * 

# * from Devel::Peek::Dump output


say 'OK' if $NFD_string1 eq $NFD_string2;
say 'OK' if $NFC_string1 eq $NFC_string2;

Выход:

OK
OK

Попробовав это, я спросил меня: Есть ли причина использовать Normalization Form D вместо Normalization Form C?

1 Ответ

3 голосов
/ 21 июля 2011

Не у всех есть составная форма, и NFC фактически делает NFD сначала. Часть NFD размещает символы продолжения по порядку после начального символа, чтобы вы могли сравнить два кластера графем (причудливое название для стартера вместе с продолжающими символами), чтобы увидеть, совпадают ли они. Для того, что вы делаете в этом примере, вы должны получить те же ответы, но NFC фактически выполняет больше работы.

Есть несколько причин, по которым некоторые вещи не имеют специальной версии NFC. Многие из них пришли из исторических наборов символов. Созданная версия é предназначена для того, чтобы сделать людей Latin-1 счастливыми. Есть также версии e и ´, разработанные для того, чтобы вы могли создавать графемы самостоятельно. Есть много способов сделать это, и это не просто акценты и диакритические знаки. Кластеры графемы могут иметь несколько таких символов продолжения, и, когда вы создаете их самостоятельно, вы можете расположить их в любом порядке (по любой причине). Тем не менее, они присвоили веса. NFD упорядочит их по весам, чтобы вы могли сравнить два кластера графем, несмотря на использованный вами порядок.

Это все в Техническом отчете Unicode 15 , как сказал Даксим в комментарии. Вы захотите увидеть диаграммы и прочитать часть, которая гласит:

Как только строка полностью разложена, любые последовательности комбинированных меток, которые она содержит, располагаются в четко определенном порядке. Эта перестановка объединяющих меток выполняется в соответствии с частью алгоритма нормализации Unicode, известного как алгоритм канонического упорядочения. Этот алгоритм сортирует последовательности комбинированных меток на основе значения их свойства Canonical_Combining_Class (ccc), значения которого также определены в UnicodeData.txt. Большинство символов (включая все некомбинированные метки) имеют значение Canonical_Combining_Class, равное нулю, и не зависят от алгоритма канонического упорядочения. Такие персонажи называются специальным термином, стартер. Только подмножество меток объединения, которые имеют ненулевые значения свойств Canonical_Combining_Class, могут быть переупорядочены алгоритмом канонического упорядочения. Эти персонажи называются не начинающими.

Некоторые вещи явно используют NFD для своих данных, например, файловую систему HFS +. Во многих случаях это не имеет большого значения, потому что ваш язык программирования, вероятно, связывается с библиотечными функциями, которые преобразуют строки вашего имени файла в правильную форму.

Некоторое время спустя сегодня я буду загружать Unicode :: Support , который демонстрирует многие из этих вещей.

И, позже сегодня, Том придет и обучит нас всех. :)

...