Максимальная длина строки после выполнения переноса в юникоде
Мне нужно выполнить casefolding для набора строк, и я должен заранее убедиться, что они не превысят заданную длину после того, как это будет сделано (для жесткого кодирования необходимого размера буфера). Проблема в том, что длина строки (в кодовых точках) может измениться после применения casefolding. Смотрите, например, в Python3:
>>> "süß".casefold()
'süss'
Теперь максимальное количество кодовых точек, которое может содержать строка после выполнения casefolding, может быть легко вычислено:
>>> max(len(chr(s).casefold()) for s in range(0x10FFFF + 1))
3
Но так ли это во всех случаях? Я имею в виду, возможно ли, что последовательность точек кода (порядок, в котором они появляются) может повлиять на конечную длину строки из-за какого-то загадочного свойства Unicode? Или я могу предположить, что конечная строка всегда будет не более чем в 3 раза длиннее оригинальной?
1 ответ
Стандарт Unicode определяет регистр следующим образом:
toCasefold (X): сопоставить каждый символ C в X с Case_Folding(C).
Таким образом, каждый символ в строке переносится регистром независимо от контекста, и результаты объединяются. Это означает, что ваше предположение верно: гарантированно, что строка в сложенном регистре будет иметь в три раза больше кодовых точек оригинала.