首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi: CDO.Message编码问题

Delphi: CDO.Message编码问题
EN

Stack Overflow用户
提问于 2010-09-04 14:36:57
回答 1查看 1.6K关注 0票数 2

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

在我的Win7机器(匈牙利语)中,口音可以正常工作。

因此,如果我发送了一封邮件,使用的是“anéviedÓÖŐäŰ”,我收到的邮件格式是这样的。我在正文中使用了iso-8859-2编码,这将主题和电子邮件地址编码到(发送者地址是包含姓名)。

我以为我已经做完了。

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

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

这提供了口音-但是错误的口音。

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

é<>é

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

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

我试着把身体记录下来看看有什么变化...

代码语言:javascript
复制
Log(SBody);
Msg.Body := SBody;
Log(Msg.Body);

..。或者不是。

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

所以它有可能在CDO上丢失和错误转换生成消息。

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

代码语言:javascript
复制
s.encode('iso-8859-2')

代码语言:javascript
复制
s.decode('iso-8859-2')

但在Delphi中我看不到这个参数。

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

我想知道,我可以不用发送邮件就可以检查结果吗?

感谢您的帮助: dd

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-07 20:26:07

用"delphi string codepage“在谷歌上快速搜索一下,我就找到了torry's delphi pages,也许下面的代码片段(找到的)可以帮助解决你的问题:

代码语言:javascript
复制
{: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 }

--莱因哈德

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3641173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档