我正在读取索引到Delphi字符串的文档,如下所示:
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/String_Types_(Delphi)
一个声明说:
您可以像对数组一样索引字符串变量。如果S是一个非UnicodeString字符串变量,而i是一个整数表达式,则S [i]表示S中的第i个字节,对于多字节字符串(MBCS),它可能不是第i个字符或根本不是整个字符。同样,索引UnicodeString变量会导致元素可能不是完整字符。如果字符串在基本多语言平面(BMP)中包含字符,则所有字符均为2个字节,因此索引字符串将获得字符。但是,如果某些字符不在BMP中,则索引元素可能是代理对-而不是整个字符。
如果我正确理解,S[i]
是字符串的第i
个字节的索引。如果S
是UnicodeString
,则S[1]
是第一个字节,S[2]
是第一个字符的第二个字节,S[3]
是第一个字符的第一个字节第二个字符,等等。如果是这种情况,那么如何索引字符而不是字符串中的字节?我需要索引字符,而不是字节。
答案 0 :(得分:4)
在Delphi中,S[i]
是char
的{{1}}。但这不是Unicode“字符”,而是16位(2字节)的UTF-16编码值。在上个世纪,即直到1996年,Unicode才是16位,但现在情况不再如此!请仔细阅读Unicode FAQ。
您可能需要几个widechar
才能拥有一个完整的Unicode代码点=或多或少,我们通常称之为“字符”。如果使用变音符号,甚至这可能是错误的。
UTF-16使用单个16位代码单元对最常见的63K字符进行编码,并使用一对16位代码单元(称为替代)对Unicode中不常用的1M字符进行编码。
最初,Unicode被设计为纯16位编码,旨在 代表所有现代脚本。 (古代的文字是 用私人字符表示。)
随着时间的流逝,尤其是 在添加了超过14,500个复合字符后 与传统集的兼容性,很明显16位不是 对于用户社区来说足够了。由此产生了UTF-16。
请参阅UTF-16 FAQ
有关在Delphi中正确解码Unicode代码点的信息,请参见Detecting and Retrieving codepoints and surrogates from a Delphi String(在评论中由@LURD链接)