Delphi:CDO。消息编码问题
我们编写了一个Delphi程序,用CDO发送一些信息 在我的Win7机器匈牙利语中,口音工作正常 因此,如果我发送了一封带有ÁÍÓŐÚÜŰ的邮件,我得到的是这种格式。 我在正文中使用了iso-8859-2编码,这对主题进行了编码,发件人地址的电子邮件地址是contains name 我以为我已经做完了 但是当我尝试从Win2k3英语机器发送邮件时,邮件服务器是相同的!,结果是截断一些重音: Ű=U Ő=O 接下来,我尝试在这里使用UTF-8编码 这提供了口音,但口音是错误的 邮件中包含带“^”符号的重音符号 è 这是无效的匈牙利字母…:- 所以我想知道,如何转换或设置输入,以获得好的结果 我试着记录身体的变化Delphi:CDO。消息编码问题,delphi,encoding,diacritics,cdo.message,Delphi,Encoding,Diacritics,Cdo.message,我们编写了一个Delphi程序,用CDO发送一些信息 在我的Win7机器匈牙利语中,口音工作正常 因此,如果我发送了一封带有ÁÍÓŐÚÜŰ的邮件,我得到的是这种格式。 我在正文中使用了iso-8859-2编码,这对主题进行了编码,发件人地址的电子邮件地址是contains name 我以为我已经做完了 但是当我尝试从Win2k3英语机器发送邮件时,邮件服务器是相同的!,结果是截断一些重音: Ű=U Ő=O 接下来,我尝试在这里使用UTF-8编码 这提供了口音,但口音是错误的 邮件中包含带“^”符
Log(SBody);
Msg.Body := SBody;
Log(Msg.Body);
。。。或者不是
但是这些日志提供了很好的结果,输入很好
因此,CDO生成消息时可能会丢失和错误转换
如果我能将ANSI文本编码成真正的UTF,我可以帮助CDO吗。
但是在Delphi中,转换器函数没有代码页参数。
在Python中,我可以说:
s.encode('iso-8859-2')
或
但是在Delphi中我看不到这个参数
有人知道,如何保存重音,如何转换带重音的匈牙利字符串来保存重音格式吗
我想知道,我能在不发送邮件的情况下检查结果吗
感谢您的帮助:
dd用delphi字符串代码页快速搜索google,我找到了 也许下面找到的代码片段可以对您的问题有所帮助:
{: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 }
-reinhard一个带有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 }
-reinhard请告诉我们您正在使用的Delphi版本。工作与2009版以上的版本不同,因为它们引入了UNICODE。除了Delphi版本之外,它还可以帮助您了解如何访问CDO功能。我刚刚导入了该组件的类型库,但找不到任何名为encode或decode的函数,只有GetEncodedContentStream/GetDecodedContentStream。如果python提供这些编码/解码函数,那么可能是python通过添加额外的方法来增强实际的CDO实现。但我不知道如何在德尔福下做到这一点。因为函数没有用于编码或解码的codepage/lang的参数。。。请帮帮我!谢谢:请告诉我们您正在使用的Delphi版本。工作与2009版以上的版本不同,因为它们引入了UNICODE。除了Delphi版本之外,它还可以帮助您了解如何访问CDO功能。我刚刚导入了该组件的类型库,但找不到任何名为encode或decode的函数,只有GetEncodedContentStream/GetDecodedContentStream。如果python提供这些编码/解码函数,那么可能是python通过添加额外的方法来增强实际的CDO实现。但我不知道如何在德尔福下做到这一点。因为函数没有用于编码或解码的codepage/lang的参数。。。请帮帮我!谢谢:你好!我用你的代码来转换字符串。当我在匈牙利语窗口中进行此操作时,CDO会发送正常的重音字符。当我把英语机器送来时,口音就消失了。尽管如此,我还是在发送之前将其转换为WideString,并将BodyPart.CharSet设置为iso-8859-2或utf-8…:-另外,我用一个简单的代码测试了这两台机器。这不使用CDO,只使用WideString和UTF-s。我把它们生成了一个文件。我比较了这两个文件,它们是相同的,不管我在哪里生成的。所以这似乎是CDO的问题-但我不知道,我在哪里寻找解决方案…:-今天我用Python和CDO进行了测试。Python字符串会根据需要转换为邮件。口音看起来不错。这就是问题所在:我们在Delphi方面对WideString中丢失的重音做了什么错误,Python对它们剩下的重音做了什么?我尝试了28592和1250,但在Delphi和english windows中都失败了…:-我解决了这个问题。问题是我使用了一个Delphi对象,一个CDO的包装器。这使用了字符串属性,它以静默和透明的方式将宽字符串转换为字符串。。。很抱歉打扰您,感谢您提供的良好解决方案!你好我用你的代码来转换字符串。当我在匈牙利语窗口中进行此操作时,CDO会发送正常的重音字符。当我把英语机器送来时,口音就消失了。尽管如此,我还是在发送之前将其转换为WideString,并将BodyPart.CharSet设置为iso-8859-2或utf-8…:-另外,我用一个简单的代码测试了这两台机器。这不使用CDO,只使用WideString和UTF-s。我把它们生成了一个文件。我比较了这两个文件,它们是一样的,没关系
重新生成。所以这似乎是CDO的问题-但我不知道,我在哪里寻找解决方案…:-今天我用Python和CDO进行了测试。Python字符串会根据需要转换为邮件。口音看起来不错。这就是问题所在:我们在Delphi方面对WideString中丢失的重音做了什么错误,Python对它们剩下的重音做了什么?我尝试了28592和1250,但在Delphi和english windows中都失败了…:-我解决了这个问题。问题是我使用了一个Delphi对象,一个CDO的包装器。这使用了字符串属性,它以静默和透明的方式将宽字符串转换为字符串。。。很抱歉打扰您,感谢您提供的良好解决方案!