背景:这个问题涉及2009年以下的Delphi版本(即没有内置的Unicode支持).我有一个规范,要求我通过TCP连接传输Unicode编码的字符串,但我没有Delphi 2009.
问题是否有单个函数或非常小的库(我不需要太多批量),我可以使用它在发送电报之前立即将单个字符串编码为UTF-8?作为我的问题的第二部分:如果有UTF-8编码的字符串作为响应被发回,我想我将需要另一个函数将其恢复为Delphi字符串格式.我以这种方式理解这种Unicode支持的局限性.
我需要编写一个从左到右翻转字符串的所有字符的函数.
例如:
译文:你好.
应该成为
.goȡyzⱥlëhtrểvoᶁềṕmujxofnworḇkçiuqėhT
我可以将问题限制在UTF-16(与UTF-8有相同的问题,只是不那么频繁).
一个天真的解决方案可能会尝试翻转所有的东西(例如,逐字逐句,其中一个字是16位 - 如果我们假设一个字节是16 位,我会说字节为字节.我也可以说字符-for-character其中character是Char表示单个代码点的数据类型):
String original = "??f???r??n?t";
String flipped = "";
foreach (Char c in s)
{
flipped = c+fipped;
}
Run Code Online (Sandbox Code Playgroud)
导致错误翻转文本的结果:
??f???r??n?t?t?n??r???f??这是因为一个"字符"需要多个"代码点".
??f???r??n?t? ? f ˜ ? ? r ? ? n i t ?并翻转每个"代码点"给出:
? t i n ? ? r ? ? ˜ f ? ?这不仅不是有效的UTF-16编码,它的字符也不一样.
当存在以下情况时,问题发生在UTF-16编码中:
这些相同的问题在UTF-8编码中发生,附加情况
我有以下代码snippit将无法编译:
procedure Frob(const Grob: WideString);
var
s: WideString;
begin
s :=
Grob[7]+Grob[8]+Grob[5]+Grob[6]+Grob[3]+Grob[4]+Grob[1]+Grob[2];
...
end;
Run Code Online (Sandbox Code Playgroud)
德尔福5抱怨Incompatible types.
我尝试将其简化为:
s := Grob[7];
Run Code Online (Sandbox Code Playgroud)
哪个有效,并且:
s := Grob[7]+Grob[8];
Run Code Online (Sandbox Code Playgroud)
没有.
我只能假设WideString[index]没有返回WideChar.
我试图强迫事情WideChars:
s := WideChar(Grob[7])+WideChar(Grob[8]);
Run Code Online (Sandbox Code Playgroud)
但那也失败了:
不兼容的类型
5:Delphi 5