WIDESTRING的UTF8版本

时间:2013-07-10 21:05:45

标签: delphi

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

那么WIDESTRING的UTF8版本是什么?

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

1 个答案:

答案 0 :(得分:9)

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

如果您希望字符串wsUTF8String 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系列),那么您应该考虑使用UnicodeString而不是WideString。前者是本机Delphi类型,而后者更像是Windows BSTR类型的包装器。但是,在分配AnsiStringUTF8String衍生产品时,这两种类型都会显示自动转换行为,因此您输入的类型不会影响此答案。


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

ws := Utf8Decode(s);