我试图更好地理解 Delphi 中的代理对和 Unicode 实现。
如果我在 Delphi 中对 Unicode 字符串 S := 'Ĥà̲V̂e' 调用 length() ,我会返回 8。
这是因为单个字符 [Ĥ]、[à̲]、[V̂] 和 [e] 的长度分别为 2、3、2 和 1。这是因为 Ĥ 有一个代理项,à̲ 有两个额外的代理项,V̂ 有一个代理项,而 e 没有代理项。
如果我想返回包含所有代理项的字符串中的第二个元素 [à̲],我该怎么做?我知道我需要对各个字节进行某种测试。我使用例程进行了一些测试
function GetFirstCodepointSize(const S: UTF8String): Integer;
在这个 SO Question中引用。
但得到了一些不寻常的结果,例如,这里有一些不同代码点的长度和大小。 下面是我如何生成这些表的片段。
...
UTFCRUDResultStrings.add('INPUT: '+#9#9+ DATA +#9#9+ 'GetFirstCodePointSize = ' +intToStr(GetFirstCodepointSize(DATA))
+#9#9+ 'Length =' + intToStr(length(DATA)));
...
第一组:这对我来说很有意义,每个代码点大小加倍,但这些都是一个字符,Delphi 给我的长度只有 1,完美。
INPUT: ď GetFirstCodePointSize = 2 Length =1
INPUT: ơ GetFirstCodePointSize = 2 Length =1
INPUT: ǥ GetFirstCodePointSize = 2 Length =1
第二组:最初在我看来,长度和代码点是颠倒的?我猜这是因为字符+代理被单独处理,因此第一个代码点大小是'H',即1,但长度返回'H'加上'^'的长度。
INPUT: Ĥ GetFirstCodePointSize = 1 Length =2
INPUT: à̲ GetFirstCodePointSize = 1 Length =3
INPUT: V̂ GetFirstCodePointSize = 1 Length =2
INPUT: e GetFirstCodePointSize = 1 Length =1
一些额外的测试...
INPUT: ¼ GetFirstCodePointSize = 2 Length =1
INPUT: ₧ GetFirstCodePointSize = 3 Length =1
INPUT: GetFirstCodePointSize = 4 Length =2
INPUT: ß GetFirstCodePointSize = 2 Length =1
INPUT: GetFirstCodePointSize = 4 Length =2
Delphi 中是否有可靠的方法来确定 Unicode 字符串中元素的开始和结束位置?
我知道我使用元素这个词的术语可能不正确,但我认为代码点和字符也不正确,特别是考虑到一个元素的代码点大小可能为 3,但长度仅为 1。