我有一个文本需要将其存储在一个widestring
变量中。但是我的文本是 UTF8 并且 Widestring 不支持 UTF8 并将其转换为一些中文字符。
那么是否有任何 UTF8 版本的 WIDESTRING?
我总是使用UTF8string
,但在这种情况下我必须使用WideString
我有一个文本需要将其存储在一个widestring
变量中。但是我的文本是 UTF8 并且 Widestring 不支持 UTF8 并将其转换为一些中文字符。
那么是否有任何 UTF8 版本的 WIDESTRING?
我总是使用UTF8string
,但在这种情况下我必须使用WideString
当您将变量分配给UTF8String
变量时WideString
,编译器会自动插入指令来解码字符串(在 Delphi 2009 及更高版本中)。它将 UTF-8 转换为 UTF-16,这是WideString
成立的。如果您的WideString
变量包含中文字符,那是因为您的 UTF-8 编码字符串包含 UTF-8 编码的中文字符。
如果您希望您的字符串ws
在 中保存 16 位版本的字节UTF8String
s
,那么您可以通过一些类型转换绕过自动转换:
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 类型,而后者更像是 WindowsBSTR
类型的包装器。但是,这两种类型在分配到和从AnsiString
派生类(如 )时都表现出自动转换行为UTF8String
,因此您使用的它们类型不会影响此答案。
在早期的 Delphi 版本中,编译器会尝试使用系统代码页(绝不是 UTF-8)对字符串进行解码。要使其正确解码字符串,请调用Utf8Decode
:
ws := Utf8Decode(s);