cout 與 wcout 有何不同
基本概念:
字符集:字元的數字**集。 有ansi/ascii、mbcs(multibytes)、unicode 等。比如「漢」字 unicode **為 0x6c49。
編碼方案:記錄字元**的方式。有 utf-8、utf-16、gb2312 等。編碼方案分「變長編碼」與「定長編碼」兩種。utf-8 是變長編碼
字符集與編碼方案概念分明,卻互依互存。字符集與編碼方案是配套的。比如提到 gb2312 編碼,即是指 gb2312 字符集與 gb2312 編碼方案。此處 gb2312 為兩位元組定長編碼。而提到 unicode 編碼,即指 unicode 字符集與 utf-x 編碼方案。其中 utf-16 為兩位元組定長編碼,utf-8 設計為變長是為了工業應用中相容已有的 ansi/ascii 編碼,並廣泛應用於網際網路業務。
原始碼檔案與生成的程式檔案編碼是兩回事兒。原始碼檔案編碼是文字檔案儲存時指定的編碼;而程式檔案編碼依賴系統環境設定
常量字串在**中是用原始碼檔案編碼記錄的;而編譯時將如何處理呢?這就討論到了 cout 與 wcout 之不同。win32 中,二者之別等價於變長與定長編碼之分,或者說是採用非 utf-16 還是 utf-16 之分。自 win2k 以降,基於 winnt 核心的 win os 已全面更新為 utf-16 編碼。此處 unicode 僅指unicode 字符集配 utf-16 編碼。其餘,包括 utf-8、utf-7、gb2312、ansi/ascii 等一律劃歸 multibytes。故而 multibytes 應理解為「變長」字元,而非「多」字元。
二者轉換,winapi 提供multibytetowidechar 和widechartomultibyte 方法。轉換的依據是codepage
。對此,msdn 上有細目可查。比如 ms936 碼頁便是 gb2312 與 unicode 的對映關係表。
msdn上提供的**示例(略作修改測試區別):
// iostream_cerr.cpp
// compile with: /ehsc
// by default, cerr and clog are the same as cout
#include #include
using namespace std;
void testwide( )
int main( )
l 將字串轉碼成 utf-16 流wcout中,l將字串轉碼成 utf-16 流,沒有加 l,編譯時按系統預設環境編碼。
沒有:wcout.imbue ( locale ( "chs" ) ); 輸出結果
enter a number漢字: 7
test for cerr漢字
test for clog漢字
enter a number:7
test for wcerrtest for wclog
有:wcout.imbue ( locale ( "chs" ) );輸出結果
enter a number漢字:9
test for cerr漢字
test for clog漢字
enter a number:9
test for wcerr漢字
test for wclog漢字
指定了 chs 環境,也即 ms936 codepage 對映,因此系統將 utf-16 碼流轉為 gb2312 碼流輸出到控制台快取(控制台為 i/o 終端檔案)。
c與c 中struct區別
這裡有兩種情況下的區別。1 c的struct與c 的class的區別。2 c 中的struct和class的區別。在第一種情況下,struct與class有著非常明顯的區別。c是一種過程化的語言,struct只是作為一種複雜資料型別定義,struct中只能定義成員變數,不能定義成員函式 在純粹的c語...
C 中 與 的區別
看過一些文章,關於這個的簡單而容易被忽略的語法,說的總有點瑕疵。貼 15秒之內應該能知道c 中乙個 和兩個 的區別,開始計數了.5秒看 namespace test927demo onemethod twomethod console.writeline c 乙個 符號的作用是 console.wr...
C 中this與 this的區別
在c primer 第五版 的練習題7.27於7.28中,對於this返回值的練習中有疑問,因此參照了博主daimous的一篇部落格,但是仍然有些許地方有需要深入理解的地方。return this返回的是當前物件的轉殖或者本身 若返回型別為a,則是轉殖,若返回型別為a 則是本身 return thi...