代码之家  ›  专栏  ›  技术社区  ›  durumdara

德尔福:CDO.消息编码问题

  •  2
  • durumdara  · 技术社区  · 15 年前

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

    所以如果我发一封带“°”的邮件,我就得到了这种格式。

    我以为我完成了这个。

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

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

    这提供了口音-但口音不对。

    我试着记录尸体的变化。。。

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

    ... 不管怎样。

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

    如果我能将ANSI文本编码成真正的UTF,我可以帮助CDO吗。 用Python我可以说:

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

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

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

    有人知道,如何保存重音,如何转换重音匈牙利字符串来保存重音格式吗?

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

    感谢您的帮助: dd公司

    1 回复  |  直到 15 年前
        1
  •  0
  •   macf00bar    15 年前

    用“delphi string codepage”在google上快速搜索,我找到了 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 }
    

    --赖因哈德

    推荐文章