delphixe2中的UTF8Encode

delphixe2中的UTF8Encode,delphi,unicode,delphi-7,delphi-xe2,Delphi,Unicode,Delphi 7,Delphi Xe2,我正在尝试使用 Var encode:ansistring; begin encode:=UTF8Encode('اختبار'); showmessage(encode); end; 它在Delphi 7中运行良好 但在DelphiXe2中,它是以问号形式发送文本的 有什么建议吗?在您的Delphi 7代码中,您可能编写了如下内容: var UTF8: string; InputString: WideString;//I guess that you used WideS

我正在尝试使用

Var
 encode:ansistring;
begin
  encode:=UTF8Encode('اختبار');
  showmessage(encode);
end;
它在Delphi 7中运行良好

但在DelphiXe2中,它是以问号形式发送文本的


有什么建议吗?

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

var
  UTF8: string;
  InputString: WideString;//I guess that you used WideString
.....
UTF8 := UTF8Encode(InputString);
这在Delphi7中很好,其中
string
AnsiString
的别名。在XE2中,通用的
字符串
类型现在是UTF-16编码的
UnicodeString
的别名。这意味着当上面的代码由XE2编译时,由
UTF8Encode
返回的UTF-8编码缓冲区被解释为UTF-16编码文本。这种不匹配导致你的字符串充满了问号

那么,如果你只是写

var
  UTF8: AnsiString;
  InputString: string;//aliased to UnicodeString
.....
UTF8 := UTF8Encode(InputString);
然后,您将有与Delphi7代码相同的行为

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

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

Delphi 2009及更高版本的Unicode方面的主要参考资料是,我建议您在继续之前阅读。

我对答案进行了一个有根据的猜测,但您的实际代码会有所帮助!现在把它添加到问题中还为时不晚,正如david所说,如果你不显示代码,任何人都愿意帮助你,这真是令人惊讶。特别是如果您编写
x:=UTF8Encode(…
,什么类型的
x
?当我运行你的代码时,它不会产生问号。这就是你正在运行的代码吗?你的源代码文件是如何编码的?你在你的机器上使用的是什么语言环境?你有没有尝试应用我的答案和/或马可的文章中的要点?@David Heffernan这不是确切的代码,因为我现在回家了这段代码在Delphi7和DelphiXe2之间给出了不同的结果。无论如何,我还是要感谢你们