Delphi UTF8ToAnsi 失败

Delphi UTF8ToAnsi failure

当我在此字符串上使用 UTF8ToAnsi 时,结果为空。知道为什么会这样吗?

msgstr "2. Broughton, PMG。^iJournal of Automatic Chemistry.^n ^lVol 6. No 2. (April – June 1984) pp 94-95."

这说明了问题:

procedure TForm1.FormShow(Sender: TObject);
begin
Memo1.Lines.Text :=
  '<<' +
  UTF8ToANSI('msgid "2. Broughton, PMG. ^iJournal of Automatic Chemistry.^n^lVol 6. No 2. (April – June 1984) pp 94-95."') +
  '>>';
end;

产生

"<<>>"

Utf8ToAnsi returns 如果输入不是有效的 UTF-8(例如具有不完整的多字节字符或格式错误的尾随字节),则为空字符串。您可以调试您的程序以发现您的字符串真正包含的内容。您显然在获取输入字符串的方式上有问题。也许您误解了 UTF-8,或者也许您从来没有真正使用过 UTF-8。

您在 4 月到 6 月之间使用的破折号不是有效的 UTF8。所以无法正确解码。这不是立即可见的,但您在此处使用的符号不是正常的减号,而是不同的字符。

您的代码失败,因为您传递的内容不是 UTF-8 编码的。您传递给此函数的内容实际上是 ANSI 编码的。当 Utf8Decode 收到该文本时,它会尝试对其进行解码,当它遇到格式错误的字节(不是 UTF-8 的字节)时,它会退出并 returns 空字符串。

问题字符是 1984 年 4 月 – 6 月 中的破折号,它是一个正破折号。在 ANSI 中编码为 #150。当您尝试将其解释为 UTF-8 时,#150 不是字符的单字节编码,并且作为多字节序列的第一个字节也是无效的。因此失败。

要解决您的实际问题,您需要弄清楚为什么在您希望使用 UTF-8 的地方有非 UTF-8 的数据。