Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi WIDESTRING的UTF8版本_Delphi - Fatal编程技术网

Delphi WIDESTRING的UTF8版本

Delphi WIDESTRING的UTF8版本,delphi,Delphi,我有一个文本需要存储在widestring变量中。但我的文本是UTF8,而widestring不支持UTF8并将其转换为一些汉字 那么有UTF8版本的WIDESTRING吗 我总是使用UTF8string,但在这种情况下,我必须使用WideString当您将UTF8string变量分配给WideString变量时,编译器会自动插入指令来解码字符串(在Delphi 2009及更高版本中)。它将UTF-8转换为UTF-16,这就是WideString所包含的内容。如果WideString变量包含汉字

我有一个文本需要存储在
widestring
变量中。但我的文本是UTF8,而widestring不支持UTF8并将其转换为一些汉字

那么有UTF8版本的WIDESTRING吗


我总是使用
UTF8string
,但在这种情况下,我必须使用
WideString

当您将
UTF8string
变量分配给
WideString
变量时,编译器会自动插入指令来解码字符串(在Delphi 2009及更高版本中)。它将UTF-8转换为UTF-16,这就是
WideString
所包含的内容。如果
WideString
变量包含汉字,那是因为您的UTF-8编码字符串包含UTF-8编码的汉字

如果希望字符串
ws
保存
UTF8String
s
中字节的16位版本,则可以通过一些类型转换来绕过自动转换:

var
  ws: WideString;
  i: Integer;
  c: AnsiChar;

SetLength(ws, Length(s));
for i := 1 to Length(s) do begin
  c := s[i];
  ws[i] := WideChar(Ord(c));
end;

如果您使用Delphi 2009或更高版本(包括XE系列),那么您应该考虑使用<代码> UnoDeSooS而不是<代码>广谱。前者是一种原生的Delphi类型,而后者更像是Windows

BSTR
类型的包装器。但是,这两种类型在赋值给
AnsiString
派生词(如
UTF8String
)和从中赋值时都会显示自动转换行为,因此它们使用的类型不会影响此答案


在早期的Delphi版本中,编译器将尝试使用系统代码页(从来不是UTF-8)对字符串进行解码。要使其正确解码字符串,请调用
Utf8Decode

ws := Utf8Decode(s);

请使用一个版本标签,即您正在使用的版本。我猜您使用的是Unicode Delphi。那么为什么要使用WideString呢。我想你需要仔细研究一下这个话题。从Marco的白皮书开始。UTF-8的宽度为8位,因此将其存储在16位
WideString
中是不必要的过度使用。您应该指定您使用的Delphi版本。在D2009之前,Delphi对Unicode知之甚少,而且UTF8String只是AnsiString的别名,并且除了system one之外没有代码页支持,您需要注意正确的转换。从2009年起,它的代码页意识,可以照顾大多数转换。此外,WideString是COM BString的一种实现,自2009年以来,它不是默认的UTF-16字符串实现。