WIDESTRING的UTF8版本

3

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

那么是否有UTF8版本的WIDESTRING呢?

我通常使用UTF8string,但在这种情况下我必须使用WideString


请使用一个版本标签,即您正在使用的版本。我猜你正在使用Unicode Delphi。那么为什么要使用WideString?我怀疑您需要阅读相关主题。从Marco的白皮书开始阅读吧。 - David Heffernan
UTF-8只有8位宽,因此将其存储在16位的“WideString”中是不必要的浪费。 - OnTheFly
你应该指定你使用的 Delphi 版本。在 D2009 之前,Delphi 几乎没有 Unicode 的意识, UTF8String 只是 AnsiString 的别名,除系统自带字符集支持外,没有编码页支持,需要注意正确转换。从 2009 年开始,它是编码页感知的,并可以处理大多数转换。此外,WideString 是 COM BString 的实现,从 2009 年以后不再是默认的 UTF-16 字符串实现。 - Mad Hatter
1个回答

9
当你将一个UTF8String变量赋值给WideString变量时,编译器会自动插入解码字符串的指令(在Delphi 2009及更高版本中)。它将UTF-8转换为WideString所保存的UTF-16格式。如果你的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系列),则应考虑使用UnicodeString而不是WideString。前者是本地的Delphi类型,而后者更像是Windows BSTR类型的包装器。当分配给和从AnsiString衍生的类型(如UTF8String)时,这两种类型都表现出自动转换行为,因此您使用的类型不影响此答案。
在早期的Delphi版本中,编译器会尝试使用系统代码页(永远不是UTF-8)解码字符串。要使其正确解码字符串,请调用Utf8Decode函数:
ws := Utf8Decode(s);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接