相关疑难解决方法(0)

在Delphi版本中处理Unicode字符串<= 2007

背景:这个问题涉及2009年以下的Delphi版本(即没有内置的Unicode支持).我有一个规范,要求我通过TCP连接传输Unicode编码的字符串,但我没有Delphi 2009.

问题是否有单个函数或非常小的库(我不需要太多批量),我可以使用它在发送电报之前立即将单个字符串编码为UTF-8?作为我的问题的第二部分:如果有UTF-8编码的字符串作为响应被发回,我想我将需要另一个函数将其恢复为Delphi字符串格式.我以这种方式理解这种Unicode支持的局限性.

delphi unicode encoding

11
推荐指数
4
解决办法
3万
查看次数

如何水平翻转文字?

我需要编写一个从左到右翻转字符串的所有字符的函数.

例如:

译文:你好.

应该成为

.goȡyzⱥlëhtrểvoᶁềṕmujxofnworḇkçiuqėhT

我可以将问题限制在UTF-16(与UTF-8有相同的问题,只是不那么频繁).

天真的解决方案

一个天真的解决方案可能会尝试翻转所有的东西(例如,逐字逐句,其中一个字是16位 - 如果我们假设一个字节是16 位,我会说字节为字节.我也可以说字符-for-character其中characterChar表示单个代码点的数据类型):

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编码中发生,附加情况

  • 0..127 …

unicode text text-processing localization right-to-left

5
推荐指数
1
解决办法
2541
查看次数

如何通过索引访问WideString的字符?

我有以下代码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

delphi delphi-5 widestring

4
推荐指数
2
解决办法
1015
查看次数