我有一个文本需要将其存储在 widestring 变量中。但是我的文本是 UTF8 并且宽字符串不支持 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 系列),那么您应该考虑使用 UnicodeString 而不是 WideString 。前者是原生 Delphi 类型,而后者更像是 Windows BSTR 类型的包装器。但是,这两种类型在分配给 AnsiString 衍生物(如 UTF8String )和从 Utf8Decode 衍生物分配时都表现出自动转换行为,因此您使用的它们类型不会影响此答案。

在早期的 Delphi 版本中,编译器会尝试使用系统代码页(绝不是 UTF-8)对字符串进行解码。要使其正确解码字符串,请调用 ojit_code :
ws := Utf8Decode(s);

关于delphi - UTF8 版本的 WIDESTRING,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17580870/

10-11 15:52