从Delphi字符串中检测和检索代码点和代理
发布时间:2020-12-15 04:22:14 所属栏目:大数据 来源:网络整理
导读:我试图更好地理解Delphi中的代理对和Unicode实现. 如果我在Delphi中对Unicode字符串S:=’?àVe’调用length(),我会回来,8. 这是因为各个字符[?],[à],[V]和[e]的长度分别为2,3,2和1.这是因为?有代理人,有两个额外的代理人,V有代理人,e没有代理人. 如果我想
我试图更好地理解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: H? GetFirstCodePointSize = 1 Length =2 INPUT: a?? 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: |