Delphi UTF8ToAnsi失败

时间:2015-12-07 15:00:35

标签: delphi delphi-2007

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

msgstr" 2。 Broughton,PMG。 ^ iJournal of Automatic Chemistry。^ n ^ lVol 6. No 2.(1984年4月 - 6月)第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;

产生

&#34;&LT;&LT;&GT;&GT;&#34;

3 个答案:

答案 0 :(得分:2)

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

问题角色是 1984年4月 - 6月中的短划线,这是一个n-dash。在ANSI中,编码为#150。当您尝试将其解释为UTF-8时,#150不是字符的单字节编码,并且作为多字节序列的第一个字节也无效。因此失败了。

要解决您的实际问题,您需要找出在您期望UTF-8的地方有非UTF-8数据的原因。

答案 1 :(得分:1)

如果输入不是有效的UTF-8(例如具有不完整的多字节字符或格式错误的尾随字节),则

Utf8ToAnsi返回空字符串。您可以调试程序以发现字符串真正包含的内容。您显然在获取输入字符串方面存在问题。也许你会误解UTF-8,或者你可能从未真正拥有过UTF-8。

答案 2 :(得分:1)

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