我们写了一个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
答案 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 }
- 莱因哈德