2

我们编写了一个 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')

但在德尔福我没有看到这个参数。

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

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

感谢您的帮助:dd

4

1 回答 1

0

使用“delphi string codepage”进行的快速谷歌搜索让我进入了torry 的 delphi 页面 ,也许以下代码片段(在此处找到)可以阐明您的问题:

{: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 }

——莱因哈德

于 2010-09-07T12:26:07.357 回答