【问题标题】:UTF8Encode in Delphi XE2Delphi XE2 中的 UTF8Encode
【发布时间】:2012-04-09 10:57:46
【问题描述】:

我正在尝试使用转换字符串

Var
 encode:ansistring;
begin
  encode:=UTF8Encode('اختبار');
  showmessage(encode);
end;

在 Delphi 7 中运行良好

但在 Delphi XE2 中,它会将文本作为问号发送

有什么建议吗?

【问题讨论】:

  • 我对答案进行了有根据的猜测,但您的实际代码会有所帮助!现在将其作为编辑添加到问题中还为时不晚
  • 正如大卫所说,如果你不展示你的代码,任何人都愿意帮助你,这真是太棒了。特别是写x := UTF8Encode(...x是什么类型?
  • 当我运行您的代码时,它不会产生问号。那是您正在运行的确切代码吗?您的源代码文件是如何编码的?你在你的机器上使用什么语言环境?您是否尝试应用我的回答和/或 Marco 的文章中的要点?
  • @David Heffernan 这不是确切的代码,因为无论如何我现在回家了,这段代码在 Delphi7 和 Delphi XE2 之间给出了不同的结果。不管怎样,我很感谢你

标签: delphi unicode delphi-7 delphi-xe2


【解决方案1】:

在您的 Delphi 7 代码中,您可能编写了如下内容:

var
  UTF8: string;
  InputString: WideString;//I guess that you used WideString
.....
UTF8 := UTF8Encode(InputString);

这在 Delphi 7 中很好,其中 stringAnsiString 的别名。在 XE2 中,通用的 string 类型现在是 UnicodeString 的别名,它是 UTF-16 编码的。这意味着当上面的代码由 XE2 编译时,UTF8Encode 返回的 UTF-8 编码缓冲区被解释为 UTF-16 编码文本。而这种不匹配就是导致你的字符串充满问号的原因。

所以,如果你只是写了

var
  UTF8: AnsiString;
  InputString: string;//aliased to UnicodeString
.....
UTF8 := UTF8Encode(InputString);

那么您将拥有与 Delphi 7 代码相同的行为。

然而,这不是在 Unicode Delphi 中执行此操作的方法。相反,您应该使用 UTF8String 类型。这被定义为AnsiString(65001),这意味着一个带有代码页65001的8位字符单元的字符串,即UTF-8代码页。当您这样做时,您根本不需要调用UTF8Encode,因为附加到字符串类型的编码意味着编译器可以生成代码来转换字符串。现在你可以简单地写:

var
  UTF8: UTF8String;
  InputString: string;//aliased to UnicodeString
.....
UTF8 := InputString;

Delphi 2009 及更高版本的 Unicode 方面的主要参考是Marco Cantù's white paper: Delphi and Unicode,我建议您在继续之前阅读它。

【讨论】:

    猜你喜欢
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 2011-12-19
    • 2023-03-27
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多