Delphi XE2中的UTF8Encode

Moh*_*bee 2 delphi unicode delphi-7 delphi-xe2

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

Var
 encode:ansistring;
begin
  encode:=UTF8Encode('??????');
  showmessage(encode);
end;
Run Code Online (Sandbox Code Playgroud)

它在Delphi 7中运行良好

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

有什么建议?

Dav*_*nan 14

在你的Delphi 7代码中你可能写了这样的东西:

var
  UTF8: string;
  InputString: WideString;//I guess that you used WideString
.....
UTF8 := UTF8Encode(InputString);
Run Code Online (Sandbox Code Playgroud)

这在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);
Run Code Online (Sandbox Code Playgroud)

那么你将拥有与Delphi 7代码相同的行为.

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

var
  UTF8: UTF8String;
  InputString: string;//aliased to UnicodeString
.....
UTF8 := InputString;
Run Code Online (Sandbox Code Playgroud)

Delphi 2009及更高版本的Unicode方面的主要参考是MarcoCantù的白皮书:Delphi和Unicode,我建议您在继续之前阅读.