1. 程式人生 > >CStdioFile的ReadString讀入中英文的總結(unicode-ucs2/utf8-無bom/ansi) .

CStdioFile的ReadString讀入中英文的總結(unicode-ucs2/utf8-無bom/ansi) .

文章的前提:

1. 使用ReadString來讀取字串.  sizeof(TCHAR) == 2 為 wchar_t.  // 原因通常TCHAR == char時,通常使用不會有問題發生,所以文章不再討論。

1. Read文字為utf8/ansi格式:

這種情況下,使用ReadString讀入效果不理想,詳見下面說明:

utf8/ansi情況下,不能使用binary開啟然後ReadString,因為這種模式下,一次按照TCHAR的大小,讀取兩個字元,結束符號0d的話,需要讀取到0x 0d 00才會認為是讀取一行結束。而我們知道untf8/ansi情況儲存的話,裡面是沒有0x00存在的。

utf8/ansi情況下,使用typetext開啟然後ReadString,可以把字元讀入到CString裡面,但儲存是按照每次存一個位元組到TCHAR中的。

CString裡面儲存的資訊為:每個TCHAR儲存一個位元組的資訊(Char)

例如:檔案有100個位元組,同時包含有種英文,讀入到CString種,就會是100個長度

例如:ASNI格式的內容  abc內蒙古 (0x61 62  63 C4 DA C3 C9 B9 C5) 3+2*3 =9

typetext讀入到CString種,長度為9,CString轉TCHAR*的字串為

61 00 (little endian,低位元組在前,高位元組在後) 

62 00 

63 00  

C4 00

DA 00

C3 00

C9 00

B9 00

C5 00

 utf8/ansi檔案情況下,建議使用Binary開啟,然後使用Read來讀取,一個位元組一個位元組的讀取,直到讀取到'\0'為止,這樣就能讀取一個完整的uft8/ansi字串。再把這個字串轉換成unciode賦值給CString變數。

2. Read文字為unicode格式:

這種情況下,使用binary方式讀入效果比較理想:

unicode情況下:不能使用typetext方式開啟ReadString,因為unicode下,檔案中的內容 如abc在檔案中儲存為 61 00 62 00 63 00,ReadString在typetext模式下,一個位元組一個位元組來讀入到CString中,遇到0x00,讀入到CString就異常了,就不是我們想要的了。CString中是不能再中間某一位儲存0x00的。

unicode模式下,建議使用binary模式開啟ReadString,先seek到第3個位元組(前兩個位元組是unicode的標示符號),然後使用ReadString來讀取。Binary模式下,是按照TCHAR的大小,一次讀取兩個字元,這樣就不存在一個一個字元讀取到0x00的問題。