2

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

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

它在 Delphi 7 中运行良好

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

有什么建议么?

4

1 回答 1

15

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

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

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

所以,如果你只是写

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

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

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

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

Delphi 2009 及更高版本的 Unicode 方面的主要参考资料是Marco Cantù 的白皮书:Delphi and Unicode,我建议您在继续之前阅读。

于 2012-04-09T11:51:34.110 回答