Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:CDO。消息编码问题_Delphi_Encoding_Diacritics_Cdo.message - Fatal编程技术网

Delphi:CDO。消息编码问题

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编码 这提供了口音,但口音是错误的 邮件中包含带“^”符

我们编写了一个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的包装器。这使用了字符串属性,它以静默和透明的方式将宽字符串转换为字符串。。。很抱歉打扰您,感谢您提供的良好解决方案!