如何使用Indy 10.6和Delphi 7避免错误字符阅读UTF-8电子邮件

如何使用Indy 10.6和Delphi 7避免错误字符阅读UTF-8电子邮件,delphi,email,utf-8,indy,Delphi,Email,Utf 8,Indy,我正在阅读Indy 10.6.1.5187和Delphi 7的电子邮件 我只对UTF-8编码的电子邮件有问题,这些邮件在客户的电脑中被翻译成错误的字符 我读了很多关于这个问题的书,但除了自己解码原始邮件外,我还没有找到解决办法 我想知道,当发送者用UTF-8编码电子邮件时,是否有办法获得正确的电子邮件 谢谢。收到的UTF8字符串与收到的Ansi字符串一样。您必须对其进行解码。 您必须以UTF8String(Delphi7中的aka.AnsiStringakaString)的形式接收消息文本,然

我正在阅读Indy 10.6.1.5187和Delphi 7的电子邮件

我只对UTF-8编码的电子邮件有问题,这些邮件在客户的电脑中被翻译成错误的字符

我读了很多关于这个问题的书,但除了自己解码原始邮件外,我还没有找到解决办法

我想知道,当发送者用UTF-8编码电子邮件时,是否有办法获得正确的电子邮件


谢谢。

收到的UTF8字符串与收到的Ansi字符串一样。您必须对其进行解码。


您必须以
UTF8String
(Delphi7中的aka.
AnsiString
aka
String
)的形式接收消息文本,然后将其从UTF8转换为
AnsiString
或(最好是)
WideString
。您可以使用
UFT8Decode()
Utf8ToAnsi()
函数对电子邮件正文进行解码

如果使用
UFT8Decode()
函数,则仍需要支持WideString的控件来显示收到的消息

如果使用
Utf8ToAnsi()
函数,结果可能不包含不属于用户本地代码页的字符

因此,您将使用以下内容:

var
  ustrEmailBody: UTF8String;
  wstrDecoded: WideString;
begin
  ... 
  // ustrEmailBody now contains the email body
  wstrDecoded := UTF8Decode(ustrEmailBody);
  SomeUnicodeAwareMemo.Text := wstrDecoded;



有关更多信息,请参阅Delphi帮助中的
UFT8Decode()
Utf8ToAnsi()
函数的文档。

我们需要查看更多详细信息。为了提出解决方案,我认为我们首先需要诊断问题。在将数据解码为UTF-8之前,确保电子邮件的字符集实际显示UTF-8。世界上并非所有人都使用UTF-8。@RemyLebeau-我的回答直接解决了问题中所述的问题。约翰写道:“我只对UTF-8编码的电子邮件有问题,这些邮件在客户的电脑中被翻译成错误的字符。”
var
  ustrEmailBody: UTF8String;
  astrDecoded: AnsiString;
begin
  ... 
  // ustrEmailBody now contains the email body
  astrDecoded := Utf8ToAnsi(ustrEmailBody);
  SomeMemo.Text := astrDecoded; // the memo might display '?' in place of unknown characters