首先從熟悉的ASCII編碼說起
基本ASCII 編碼一共7位,2^7=128個,對於英文26個字母那是綽綽有餘的。
但是咱們中國漢字博大精深啊,區區128個字啥完整的意思可能都表示不了
於是產生了各種各樣的新的編碼
在VC中 漢字是使用GB2312編碼來存儲的,GB2312就是2Byte表示一個漢字
進入VC反彙編一下
char name[10]="你好誰啊";
004113B8 A1 40 57 41 00 mov eax,dword ptr [string "\xc4\xe3\xba\xc3\xcb\xad\xb0\xa1" (415740h)]
004113BD 89 45 EC mov dword ptr [ebp-14h],eax
004113C0 8B 0D 44 57 41 00 mov ecx,dword ptr ds:[415744h]
004113C6 89 4D F0 mov dword ptr [ebp-10h],ecx
004113C9 8A 15 48 57 41 00 mov dl,byte ptr ds:[415748h]
004113CF 88 55 F4 mov byte ptr [ebp-0Ch],dl
004113D2 33 C0 xor eax,eax
004113D4 88 45 F5 mov byte ptr [ebp-0Bh],al
看到string "\xc4\xe3\xba\xc3\xcb\xad\xb0\xa1“這一段了嗎,”你好啊誰“,四個字佔了八個字節,所以一個字佔了兩個字節
\x的意思就是十六進制轉義符了,實際的每個字對應是
你:c4e3 好:bac3 啊:cbxa 誰:b0xa
爲了驗證到底是否符合之前所說,可以打開http://tool.xker.com/gb2312tbl.php 進行GB2312編碼到具體文字的查詢,證明是成立的。
最後還得注意下這句話:
004113CF 88 55 F4 mov byte ptr [ebp-0Ch],dl
這句話也是關鍵,作爲一個字符串讀入,VC自動添加結束符到數組結尾。edx寄存器在執行mov byte ptr [ebp-0Ch],dl時候值是0000000h,所以實際上就是傳入00到數組結尾,就是傳說中的\0啦
最後的內存分佈:
0x0012FF4C cc cc cc cc cc cc cc
0x0012FF53 cc c4 e3 ba c3 cb ad
0x0012FF5A b0 a1 00 cc cc cc cc
那些在一大堆cc中間的萬花叢中一點紅就是我們熟悉的中文的GB2312編碼啦,注意後頭還有個00
關於如何讀寫,發現VC還是相當方便,平常字符是如何存儲讀寫,他也不差多少
char name[10]="你好";
就是注意中文字符是2Byte,一個char類型1Byte,所以要計算好數組容量,尤其是還得額外加上結尾的\0 ,防止不必要的溢出
可以
scanf("%s",name);
直接讀入中文字符串