关于GBK编码及C语言中文输出问题
關于GBK編碼及C語言中文輸出問題
引入
在使用C語言進行輸出時,我們可以發現漢字是占兩個字節的,如果想打印出漢字需要連續打印兩個字節,如果僅僅打印一個漢字字節會出現輸出為空的情況。如此情況的產生是因為漢字的編碼關系。目前應用最為靈活的utf-8,在很多編譯器中并不是默認的編碼方式,乃至我們的電腦中,選擇中文區域后我們的漢字編碼為GBK編碼。
GB2312及GBK編碼
GB2312是我國的第一種漢字編碼。盡管ASCII 碼成功的對西方字符編碼的標準進行了統一,但作為7位編碼,表示范圍有限(0~127),就算是8位ASCII 碼,高位的128個字符作為擴展,也都是用來存放英文的制表符,部分音標字符等其它符號。常用的漢字有幾千個,為了解決漢字編碼問題,GB2312應運而生。
GB2312采用區位碼進行設計,將編碼表分為94個區,每個區94個位,每個位放置1個字符。即使用雙字節對一個漢字進行編址,前一個字節代表這個漢字在編碼表的區號,后一個字節代表這個漢字在區中的位號。一般編碼方式為0xA0 + 區號,0xA0 + 位號,漢字的編碼范圍是0xB0A1~0xF7FE
在區號中01-09是符號區,16-87是漢字區,10-15及88-94是未定義的空白區。
GB2312滿足了基本的漢字編碼需要,但未收錄繁體字和生僻字,為了更好處理人名和古漢語,GBK橫空出世,是GB2312的超集,相同字符編碼相同,收錄字符更多,更廣。
這里提供漢字與國際碼轉換查詢網:https://www.qqxiuzi.cn/bianma/guobiaoma.php
?
正確輸出及中文判斷
這里以漢字【加】為例,對應編碼為:
根據前文介紹,BC為區號,D3為位號。轉換為對應的十進制:BC(188) D3(211)
當我們把兩個字符連續打印時,如果第一個字符是數值大于ASCII碼的最高范圍127,則會將其視為其它編碼格式,在正確的區位號下,編譯器識別其為GBK,從而輸出漢字。
如上圖所示,字符數值符合ASCII碼范圍,則按照ASCII碼進行解析。
當我們將中文字符編碼分開輸出時,由于字符數值高于ASCII碼又違背了GBK編碼雙字節的編碼規則,此時無法正常輸出。
如何判斷是否為中文字符
需求:輸入一串文字,將文字中的半角字符剔除,將全角字符輸出
【全角】:一個字符占兩個字節
【半角】:一個字符占一個字節
根據需求,可以發現我們需要的是將漢字輸出,其它剔除。上文提到,漢字的區號是0xA0 + 區號,因此只要第一個字符大于0xA0,此時順序輸出下一個字符即可。
#include <stdio.h> #include <stdlib.h>#define TRUE 1 #define FALSE 0 // @名稱:is2byte函數 // @用途:判斷是否為全角文字的第一個字節 int is2byte(int ch){if(ch > 0xa0){return TRUE; /*2字節文字(全角)*/}elsereturn FALSE; /*1字節文字(半角)*/ }int main(){int ch;while((ch = getchar())!=EOF){if(is2byte(ch) == TRUE){putchar(ch);putchar(getchar());}}return 0; }此篇博客是博主在遇到問題,搜索資料后的簡單記錄,博主才疏學淺,如果博文出現錯誤請及時指出,也請各位諒解!
參考博文:https://blog.csdn.net/itplus/article/details/15341009
總結
以上是生活随笔為你收集整理的关于GBK编码及C语言中文输出问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7个免费的Linux FTP客户端工具
- 下一篇: 【收集】11款Linux数据恢复工具