我有一個文本,我需要將其存儲在widestring
變量中。但是我的文本是UTF8,而widetring不支持UTF8並將其轉換爲一些中文字符。UTF8版本的WIDESTRING
所以有沒有任何UTF8版本的WIDESTRING?
我總是用UTF8string
但在這種情況下,我必須使用WideString
我有一個文本,我需要將其存儲在widestring
變量中。但是我的文本是UTF8,而widetring不支持UTF8並將其轉換爲一些中文字符。UTF8版本的WIDESTRING
所以有沒有任何UTF8版本的WIDESTRING?
我總是用UTF8string
但在這種情況下,我必須使用WideString
當您將UTF8String
變量到WideString
變量,編譯器會自動插入指令到字符串解碼(在2009年和以後的Delphi)。它將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類型,而後者更多是Windows BSTR
類型的包裝。雖然這兩種類型在分配衍生物等衍生產品時都會顯示自動轉換行爲,因此它們使用的類型不會影響此答案。
在早期的Delphi版本中,編譯器將嘗試使用系統代碼頁的字符串解碼(這是從來沒有UTF-8)。要正確解碼字符串,請致電Utf8Decode
:
ws := Utf8Decode(s);
'UTF8Decode'? 。 –
請使用一個版本標籤,即您使用的版本。我想你正在使用Unicode Delphi。那麼爲什麼要使用WideString。我懷疑你需要閱讀這個話題。從Marco的白皮書開始。 –
UTF-8是** 8 **位寬,因此將其存儲在** 16 **位'WideString'中是不必要的過量操作。 – OnTheFly