2013-07-10 23 views
3

我有一個文本,我需要將其存儲在widestring變量中。但是我的文本是UTF8,而widetring不支持UTF8並將其轉換爲一些中文字符。UTF8版本的WIDESTRING

所以有沒有任何UTF8版本的WIDESTRING?

我總是用UTF8string但在這種情況下,我必須使用WideString

+2

'UTF8Decode'? 。 –

+0

請使用一個版本標籤,即您使用的版本。我想你正在使用Unicode Delphi。那麼爲什麼要使用WideString。我懷疑你需要閱讀這個話題。從Marco的白皮書開始。 –

+0

UTF-8是** 8 **位寬,因此將其存儲在** 16 **位'WideString'中是不必要的過量操作。 – OnTheFly

回答

9

當您將UTF8String變量到WideString變量,編譯器會自動插入指令到字符串解碼(在2009年和以後的Delphi)。它將UTF-8轉換爲UTF-16,這就是WideString所持有的。如果您的WideString變量保存了中文字符,那是因爲您的UTF-8編碼的字符串保存了UTF-8編碼的中文字符。

如果你希望你的字符串ws舉行字節的16位版本在UTF8Strings,那麼你就可以繞過自動轉換與一些類型轉換:

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);