Максимальная длина строки после выполнения переноса в юникоде

Мне нужно выполнить 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).

Таким образом, каждый символ в строке переносится регистром независимо от контекста, и результаты объединяются. Это означает, что ваше предположение верно: гарантированно, что строка в сложенном регистре будет иметь в три раза больше кодовых точек оригинала.

Другие вопросы по тегам