我试图更好地理解Delphi中的代理对和Unicode实现.
如果我在Delphi中对Unicode字符串S:=’ĤàVe’调用length(),我会回来,8.
这是因为各个字符[Ĥ],[à],[V]和[e]的长度分别为2,3,2和1.这是因为Ĥ有代理人,有两个额外的代理人,V有代理人,e没有代理人.
如果我想返回字符串中的第二个元素,包括所有代理,我该怎么做?我知道我需要对各个字节进行某种测试.我使用例程运行了一些测试
function GetFirstCodepointSize(const S: UTF8String): Integer;
在this 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: 原文链接:https://www.f2er.com/delphi/101626.html