【发布时间】:2021-03-10 12:25:43
【问题描述】:
无论保存字符串需要多少字节,我如何获取 UTF8String 中可见字符的数量?
【问题讨论】:
-
这是一个复杂的话题。 Delphi 本身不提供任何东西来计算视觉长度,所以你必须自己做,或者更好地使用 Unicode 库,比如 ICU。计算 UTF-8 字符串中的 Unicode 代码点相当容易,但并不是那么简单,因为可能需要多个代码点才能产生 1 个可见的“字符”(字素簇),因此您必须考虑组合代码点等事情(口音、表情符号等)、无宽度代码点、双向修饰符等。这些东西本身不会在视觉上自行输出,但会影响可见输出。
-
MANAGING UTF-8 STRINGS 在第 15+16 页。
-
@JosefZ 这些页面没有解决 OP 的要求。
Length的UTF8String是编码的 UTF 代码单元的数量,而不是 Unicode 代码点的数量,或者代码点产生的视觉字素的数量。 -
如果
U是UTF8String,那么Length(string(U))通常是“可见字符”的实际数量可接受的近似值。在许多应用中,这个数字是完全正确的。但正如雷米指出的那样,也有不少例外。 (即使对于普通的string,Length(s)也只是“可见字符”数量的近似值。) -
您可以将 UTF8String 转换为 UnicodeString 并使用 CharNextW(如果您在 Windows 下)来计算字符数:stackoverflow.com/a/32020629