德尔菲字符串中的索引字符而不是字节



我正在阅读有关 Delphi 字符串索引的文档,如下所示:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/String_Types_(德尔福(

一份声明说:

您可以像索引数组一样为字符串变量编制索引。如果 S 是非 UnicodeString 字符串变量,而 i 是整数表达式,则 S[i] 表示 S 中的第 i 个字节,对于多字节字符串 (MBCS(,它可能不是第 i 个字符或整个字符。同样,为 UnicodeString 变量编制索引会导致元素不是整个字符。如果字符串包含基本多语言平面 (BMP( 中的字符,则所有字符均为 2 个字节,因此为字符串编制索引会获取字符。但是,如果某些字符不在 BMP 中,则索引元素可能是代理项对 - 而不是整个字符。

如果我理解正确,S[i]是字符串的第i个字节的索引。如果SUnicodeString,则S[1]是第一个字节,S[2]是第一个字符的第2个字节,S[3]是第二个字符的第一个字节,依此类推。如果是这种情况,那么如何索引字符串中的字符而不是字节?我需要索引字符,而不是字节。

在德尔福,S[i]是一个char又名widechar。但这不是 Unicode "字符",它是 16 位(2 字节(的 UTF-16 编码值。在上个世纪,即直到 1996 年,Unicode 都是 16 位的,但现在不是这样了!请仔细阅读 Unicode 常见问题解答。

您可能需要几个widechar才能拥有完整的 Unicode 代码点 = 或多或少我们通常所说的"字符"。如果使用变音符号,即使这样也可能是错误的。

UTF-16 使用单个 16 位代码单元对最常见的 63K 字符进行编码,并使用一对 16 位代码单元(称为代理项(对 Unicode 中不太常用的 1M 个字符进行编码。

最初,Unicode被设计为纯16位编码,旨在 代表所有现代文字。(古代文字是 用私人使用的字符表示。

随着时间的推移,尤其是 在添加了超过 14,500 个复合字符后 与传统集兼容,很明显 16 位不是 足以满足用户社区的需求。由此产生了UTF-16。

请参阅 UTF-16 常见问题

解答有关 Delphi 中 Unicode 代码点的正确解码,请参阅从 Delphi 字符串中检测和检索代码点和代理项(注释中按@LURD链接(

相关内容

  • 没有找到相关文章

最新更新