我需要对一组字符串执行casefolding,并且必须事先确保它们在完成后不会超过给定的长度(以硬编码所需的缓冲区大小)。问题是在应用casefolding后字符串长度(在代码点中)可能会发生变化。参见,例如,在Python3中:
>>> "süß".casefold()
'süss'
现在,可以轻松计算执行casefolding后字符串可能包含的最大代码点数:
>>> max(len(chr(s).casefold()) for s in range(0x10FFFF + 1))
3
但它在所有情况下都有效吗?我的意思是,由于Unicode的一些神秘属性,代码序列(它们出现的顺序)可能会影响字符串的最终长度吗?或者我可以假设最终字符串总是最多比原始字符串长3倍?
答案 0 :(得分:3)
Unicode standard定义了大小写,如下所示:
toCasefold(X):将X中的每个字符C映射到Case_Folding(C)。
因此,无论上下文如何,字符串中的每个字符都是大小写的,并且结果是连接的。这意味着您的假设是正确的:案例折叠字符串保证最多为原始代码点数的三倍。