Delphi:CDO.Message编码问题

时间:2010-09-04 06:36:57

标签: delphi encoding diacritics cdo.message

我们写了一个Delphi程序,用CDO发送一些信息。

在我的Win7机器(匈牙利语)中,口音很好。

因此,如果我发送了一封带有“ÁÉÍÓÖŐÚÜŰ”的邮件,我就会以这种格式收到邮件。 我在体内使用iso-8859-2编码,这对主题进行编码,电子邮件地址为(发件人地址包含名称)。

我以为我完成了这件事。

但是当我尝试从Win2k3英文机器发送邮件时(邮件服务器是相同的!),结果是截断一些重音: Ű= U. Ő= O

接下来我尝试在这里使用UTF-8编码。

这提供了重音 - 但错误的重音。

邮件中包含带^符号的重音符。

ê<> é

这不是有效的匈牙利信......: - (

所以我想知道,如何转换或设置输入我得到了很好的结果。

我试图记录身体以查看是否有变化......

Log(SBody);
Msg.Body := SBody;
Log(Msg.Body);

......或不。

但这些日志提供了良好的结果,输入很好。

因此,CDO可能会丢失和误转,生成消息。

如果我可以将ANSI文本编码为真实的UTF,我可以帮助CDO。 但在Delphi转换器函数中没有“CodePage”参数。 在Python中,我可以说:

s.encode('iso-8859-2')

s.decode('iso-8859-2')

但是在Delphi中我没有看到这个参数。

有人知道,如何保留重音符号,如何转换重音匈牙利语字符串以保留重音格式?

我想知道,我可以在不发送邮件的情况下检查结果吗?

感谢您的帮助:   DD

1 个答案:

答案 0 :(得分:0)

使用“delphi字符串代码页”进行快速谷歌搜索,让我进入torry's delphi pages  也许以下代码片段(找到 here )可以解释您的问题:

{:Converts Unicode string to Ansi string using specified code page.
  @param   ws       Unicode string.
  @param   codePage Code page to be used in conversion.
  @returns Converted ansi string.
}

function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
var
  l: integer;
begin
  if ws = ' then
    Result := '
  else 
  begin
    l := WideCharToMultiByte(codePage,
      WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
      @ws[1], - 1, nil, 0, nil, nil);
    SetLength(Result, l - 1);
    if l > 1 then
      WideCharToMultiByte(codePage,
        WC_COMPOSITECHECK or WC_DISCARDNS or WC_SEPCHARS or WC_DEFAULTCHAR,
        @ws[1], - 1, @Result[1], l - 1, nil, nil);
  end;
end; { WideStringToString }


{:Converts Ansi string to Unicode string using specified code page.
  @param   s        Ansi string.
  @param   codePage Code page to be used in conversion.
  @returns Converted wide string.
}
function StringToWideString(const s: AnsiString; codePage: Word): WideString;
var
  l: integer;
begin
  if s = ' then
    Result := '
  else 
  begin
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);
    SetLength(Result, l - 1);
    if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
        - 1, PWideChar(@Result[1]), l - 1);
  end;
end; { StringToWideString }

- 莱因哈德