最近一直在研究unicode程式設計,有一些體驗,不過還是有點處於混沌狀態的感覺。
msdn裡面有幾段文字講unicode流i/o操作函式訪問的。裡面講到如果以文字模式開啟檔案,那麼unicode流i/o函式在讀寫檔案時會進行兩種型別的字元轉換:(1)unicode與mbcs互轉;(2)cr-lf組合與單個換行字元間的轉換。
unicode與mbcs轉換發生在讀寫檔案時,讀的時候unicode流i/o函式假定流檔案為多位元組字串行,將讀進來的字元轉換成寬字元,寫的時候將寬字元轉換成多位元組字元。
cr-lf組合與單個換行字元間的轉換發生在讀之前和寫之後。
但是如果流檔案指定以二進位制模式開啟,那麼unicode流i/o函式則認為檔案是unicode編碼格式的,因此讀寫時不會做上述轉換。
看完這些文字,我用之前寫的控制台程式做了個實驗,明白了一些東西,但仍然有些東西不明白。
在控制台程式中我用fgetwc從stdin讀字元,預設情況下stdin也是以文字模式開啟的,所以fgetwc會假定輸入是多位元組字串行,所以乙個漢字是兩個位元組,那麼fgetwc讀的時候會將每個位元組都轉換成unicode寬字元,這樣其實乙個漢字就佔了4個位元組。
如果想一次性讀入乙個漢字的unicode碼,必須呼叫
_setmode( _fileno( stdin ), _o_binary ); 修改stdin的開啟模式。我試了一下,fgetwc可以一次讀入兩個位元組。而且乙個enter鍵對應的值是0x0a0d,0x0a是換行,0x0d是回車。如果對標準輸出也呼叫
setmode 設定為二進位制模式,那麼讀的內容是可以列印在控制台上的。
不過還有乙個問題沒弄明白,就是同乙個漢字,比如「我」字,從控制台輸入的unicode值為53966,也就是0xd2ce,但是如果我在程式中定義一 個字串「我」,那麼它的值是25105,也就是0x6211。可能控制台使用的**頁編號為936(簡體中文gbk),此字符集中我的碼值可能就是 53966,而程式內部使用的是unicode編碼,所以導致二者不一致。但是不知道unicode utf-16編碼的**頁編號是多少,查控制面板中的**頁轉換表中好像沒有。
IO流操作規律
流操作的基本規律 最痛苦的就是流物件有很多,不知道用哪乙個。通過兩個明確來完成。1 明確源和目的。源 輸入流。inputstream reader 目的 輸出流 outputstream writer 2 操作的資料是否是純文字 是 字元流 不是 位元組流 3 當體系確定後,在明確需要使用哪個具體物...
IO流操作規
inputstream in system.in outputstream out system.out 4,明確額外功能?需要轉換,因為都是位元組流,但是操作的卻是文字資料。所以使用字元流操作起來更為便捷。inputstreamreader isr new inputstreamreader sy...
IO 流操作規律
流的操作規律 1.明確源和目的 源 inputsream reader 目的 outputstream writer 2.明確資料是否是純文字資料 源 是純文字 reader 否 inputsream 目的 是純文字 writer 否 outputstream 3.明確具體的裝置 源裝置 硬碟 fi...