漢字編碼及C 裡的判斷

2021-05-23 01:19:59 字數 2096 閱讀 6725

dos下的點陣漢字

你是否碰到過用啟動盤啟動系統後用dir命令得到一串串莫名其妙的字元?有經驗的朋友會告訴你:那是漢字。漢字?你不禁會問:怎麼乙個我乙個也不認 識。但那確確實實是漢字,如果你啟動ucdos或其他的漢字系統後,就會看到那是乙個個熟悉的漢字。同樣是漢字,為什麼前後會看到不同的結果?呵呵,其實 在電腦硬體中,根本沒有漢字這個概念,也沒有英文的概念,這鐵玩意認識的概念只有——內碼。

漢字的內碼

點頭表示什麼?是「對」、「yes」,偏偏有的地方表示的意義卻恰恰相反。乙個動作,有不同的詮釋;乙個問題,有不同的答案;而乙個符號,卻有 不同的意義,關鍵在於:你是如何地理解。在電腦中亦如此,所有的資料都是以0和1儲存的,按不同的資料操作,可以得到不同的結果。對於顯示英文操作,由於 英文本母種類很少,只需要8位(一位元組)即可。而對於中文,常用卻有5000以上,於是我們的dos前輩想了乙個辦法,就是將ascii表的高128個很 少用到的數值以兩個為一組來表示漢字,即漢字的內碼。而剩下的低128位則留給英文本元使用,即英文的內碼。不信,你可以用記事本寫一c檔案:

main()

printf("/nchinease char=");

s=c;

while(*s!=0)

getch();

}再用tc輸入*.txt開啟執行,看見了沒有,那些數值即英文和漢字的各位元組內碼。

漢字字模

得到了漢字的內碼後,還僅是一組數字,那又如何在螢幕上去顯示呢?這就涉及到文字的字模,字模雖然也是一組數字,但它的意義卻與數字的意義有了 根本的變化,它是用數字的各位資訊來記載英文或漢字的形狀,如英文的'a'在字模中是這樣記載的:

《在圖中》

在硬體系統內,英文的字模資訊一般固化在rom裡,即使在沒有進入系統的cmos裡,也可以讓你看到英文本元。而在dos下,中文的字模資訊一般記錄在漢 字型檔檔案hzk16裡。

漢字型檔檔案

了解字母和漢字是按字模位資訊顯示的原理後,那如何得到漢字的字模資訊呢?難道要我們自己去做?no。dos前輩們經過艱辛的努力,將製作好的 字模放到了乙個個標準的庫中以免去後輩的麻煩,這就是點陣字型檔檔案。一般我們使用16*16的點陣宋體字庫,所謂16*16,是每乙個漢字在縱、橫各16 點的區域內顯示的。不過後來又有了hzk12、hzk24,hzk32和hzk48字型檔及黑體、楷體和隸書字型檔。雖然漢字型檔種類繁多,但都是按照區位的順 序排列的。前乙個位元組為該漢字的區號,後乙個位元組為該字的位號。每乙個區記錄94個漢字,位號則為該字在該區中的位置。因此,漢字在漢字型檔中的具體位置計 算公式為:94*(區號-1)+位號-1。減1是因為陣列是以0為開始而區號位號是以1為開始的。這僅為以漢字為單位該漢字在漢字型檔中的位置,那麼,如何 得到以位元組為單位得到該漢字在漢字型檔中的位置呢?只需乘上乙個漢字字模占用的位元組數即可,即:(94*(區號-1)+位號-1)*乙個漢字字模占用位元組 數,而按每種漢字型檔的漢字大小不同又會得到不同的結果。以16*16點陣字型檔為例,計算公式則為:(94*(區號-1)+(位號-1))*32。漢字型檔文 該從該位置起的32位元組資訊即記錄了該字的字模資訊。

點陣漢字的顯示

了解點陣漢字及漢字型檔的構成原理後,顯示漢字就變得簡單。以16*16點陣字型檔為例,通常的方法是:將檔案工作指標移到需要的漢字字模處、將漢 字型檔檔案讀入一2*16陣列再用for迴圈一位位地顯示。以使用vgahi模式顯示「我」字為例,程式如下:

#include "graphics.h"

#include "stdio.h"

main()

怎麼樣?只要掌握了正確的方法,顯示漢字並不複雜。

列印字型檔檔案和hzk12

看字元的編碼規範;gb2312的漢字以大於0x80的位元組開始

#include

#include

#include

int first(unsigned char ch)

int second(unsigned char ch)

int check(const char* p)

{ int i=0;

for(i=0;i適用於gb2312字符集,  

可修改first和second函式,使適用於其他字符集:)

一種可能是小於0xb0而大於0x80   ,那是gb2312中的其他字元,而非漢字.包括西文...  

另一種可能是亂碼(該字串因為未知的原因丟失了第二位,產生亂碼)

判斷漢字 編碼方式

由於常常要和漢字處理打交道,因此,我常常受到漢字編碼問題的困擾。在不斷的打擊與堅持中,也積累了一點漢字編碼方面的經驗,想和大家一起分享。一 漢字編碼的種類 漢字編碼中現在主要用到的有三類,包括gbk,gb2312和big5。1 gb2312又稱國標碼,由國家標準總局發布,1981年5月1日實施,通行...

關於字串漢字編碼的判斷

首先,這個問題不嚴謹了,如果給定乙個任意字串,不可能斷定它是否包含漢字,只有知道其編碼方式才可能判斷,比如已知為utf 16,可根據unicode標準漢字 點範圍判斷,如果是ansi本地化編碼如gb2312 1980 雙位元組最高位為1,範圍 1 0xa1 0xfe 2 0xa1 0xfe 7445...

js中的漢字編碼轉換

gbk的漢字編碼 包括gb2312 為雙位元組,比如下面的漢字維資料可以在js中可以表現為 escape 編碼js中 escape 對所有的非可見ascii進行編碼,雙位元組或者多位元組則使用十六進製制的表現形式如 維資料 的escape編碼為 u7ef4 u6570 u636e unicode編碼...