2

是否需要以特定方式设置任何编译器指令或预处理器命令以使 Indy 返回 Utf-8 字符串而不是将它们截断为 Ansi 字符串?如果这很重要,我正在处理的项目上有各种 Delphi 模式标志。

如果我直接将主题行设置为 UTF-8 字符串(如下所示),它会在 GUI 上正确显示,因此正确设置了 utf-8 支持并且我使用了适当的字体和所有这些好东西。为清楚起见,此代码中将主题声明为 Utf8String。

MailItem.Subject := 'îņŢëŕŃïóЙǟŁ ŜũƥĵεϿד'; //Displays correctly

但是,如果我从标题中提取相同的主题行,使用 Indy 对其进行解码,我会将每个国际字符替换为恰好一个问号,即应该是字符的数量。看起来它正在将 UTF-8 转换为 ANSI,这不是我想要的。

MailItem.Subject := IdCoderHeader.DecodeHeader('=?utf-8?B?w67FhsWiw6vFlcWDw6/Ds9CZx5/FgSDFnMWpxqXEtc61z7/Xkw==?='); //Displays '?????????? ???????'

那么什么事情可能会出错和/或我该如何解决呢?

我使用的是来自 Indy 网站的最新版本的 Indy10,以及 Windows 上的 Lazarus 1.0,所以我认为这不是“我的软件需要更新”错误,我认为这可能是某种配置问题。

4

1 回答 1

0

不,没有可以为此设置的编译器标志。

IndyAnsiString在 D2009 之前的 Delphi 和 3.0 之前的 FreePascal 中使用。IndyUnicodeString在 Delphi 2009+ 和 FreePascal 3.0+ 中使用。没有选项可以改变这一点。

但是,在 Delphi 和 FreePascal 的非 Unicode 版本中,在 Indy 的某些地方,您可以指示 Indy 将AnsiString输入值解释为 UTF-8,并返回 UTF-8 编码的AnsiString输出。然而,DecodeHeader()不是那些地方之一。

于 2012-10-10T19:08:33.050 回答