Как я могу проверить свойство Quick_Check персонажа (скажем, в NFD)?
Стандартное приложение Unicode #15 описывает, как каждый символ в Unicode для каждой из четырех форм нормализации имеет значение "Quick_Check", которое помогает определить, находится ли данная строка в этой форме нормализации. Далее в разделе 9.1 описывается, как это значение "Quick_Check" можно использовать для оптимизации объединения строки в нормализованную строку для получения другой нормализованной строки: нормализацию нужно выполнять только с последнего "стабильного" символа в строка слева и далее, где символ является "стабильным", если он имеет свойство "Quick_Check" и имеет класс канонического объединения 0. Это, как правило, будет более эффективным, чем повторный запуск алгоритма нормализации для всей объединенной строки, если вовлеченные строки длинные.
Это означает, что мы можем объединить как это: (здесь параметр s1
предполагается, что строка, которую мы знаем, уже находится в NFD, в то время как s2
другая строка, которая не обязательно нормализована)
def concat (s1, s2):
LSCP = len(s1) # Last stable character position
while LSCP > 0:
LSCP -= 1
if unicodedata.combining(s1[LSCP]) == 0 and has_nfd_qc(s1[LSCP]):
break
return s1[:LSCP] + unicodedata.normalize('NFD', s1[LSCP:] + s2)
unicodedata.combining()
позволяет нам определить класс канонического сочетания персонажа. Но как мы узнаем, имеет ли персонаж свойство "Quick_Check" для NFD? Другими словами, что следует заменить has_nfd_qc()
в вышесказанном?
1 ответ
Как и все данные Unicode, вы можете найти эти свойства в базе данных символов Unicode.
Свойства быстрой проверки находятся в файле DerivedNormalizationProps.txt
,
http://www.unicode.org/Public/UNIDATA/DerivedNormalizationProps.txt
Более подробную информацию о базе данных можно найти в Стандартном приложении Unicode № 44.
Вы также должны убедиться, что используете ту же версию Unicode, что и unicodedata.normalize
, Файлы данных для более старых версий можно найти здесь: