關於VC,C語言 漢字(GB2312)讀寫的一些初步探索

首先從熟悉的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);

直接讀入中文字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章