2010-07-07 106 views
2

我目前正在花費一些時間來轉換我的網絡單元以支持unicode字符串,並且目前爲止情況良好(至少我認爲是這樣)。不幸的是,我正在研究德爾福7所以我不能測試在行動中的Unicode支持,我沒有更新的德爾福版本的文檔。TReader/TWriter是否支持unicode?

我在我的代碼中使用了一些TReader和TWriter對象來使用ReadString和WriteString方法對字符串進行流式處理。在D7上,他們使用的字符串類型等於AnsiString。如果我理解正確,在D2009/D2010中,字符串類型等於UnicodeString。那麼有沒有人知道TRAader和TWriter 自動在使用D2009/D2010中的ReadString和WriteString方法時是否以UnicodeString格式對字符串進行流處理,或者是否需要更改某些內容?

+1

新版本的文檔:[TReader](http://docwiki.embarcadero.com/VCL/en/Classes.TReader),[TWriter ](http://docwiki.embarcadero.com/VCL/en/Classes.TWriter)。 – 2010-07-07 19:01:21

回答

4

是的。 TReader和TWriter支持Unicde。實際上,只有一部分不支持Unicode的vcl/rtl:舊版本的Read(Ln)和Write(Ln)文件訪問方法,它們也用於直接從控制檯讀取和寫入。

是的,string是D2009 +中的UnicodeString。 而PChar是D2009 +中的PWideChar。 所以,如果你堅持使用標準類型,你的代碼將會正常工作。

只有在假設一個字符等於一個字節的情況下編碼時,您纔會遇到麻煩。

更新

+1

如果你堅持使用標準類型,並且已經編寫了需要使用Unicode的代碼,即使它永遠不會遇到它......那麼你的代碼將會正常移植。如果您編寫的代碼假設並期望ASCII並避免使用ANSI,那麼您的代碼將端口確定,但它不會正確支持Unicode。問題是,你可能在不知不覺中做了這件事。如果您使用的是UpperCase(),那麼您不支持Unicode。要正確地支持Unicode,你應該使用ANSIUpperCase()。只給出一個奇怪和可能混淆的例子。 – Deltics 2010-07-07 21:10:55

+0

啊,是的,好點。令人困惑地命名的Ansi *方法 – 2010-07-08 06:45:54

2

我只是看着我的德爾福2010安裝和TWriter有以下方法:

procedure WriteStr(const Value: AnsiString); 
procedure WriteUTF8Str(const Value: string); 
procedure WriteString(const Value: UnicodeString); 
procedure WriteWideString(const Value: UnicodeString); 

踏浪具有等效的方法。因此,WriteStr(和ReadStr)將與AnsiStrings一起使用以實現向後兼容性,WriteString和WriteWideString會將unicode字符串編寫爲unicode,WriteUTF8Str接受unicode字符串並將其寫爲UTF8。 (如果使用ANSI字符集,則可節省大量空間)。