最近在項目中碰到利用java預設的Collator.getInstance(Locale.China)進行預設的拼音排序時有一部分漢字無法正確的通過預設的排序方式自動進行排序。查詢了一下資料,原來問題出現在中文字型檔上面,預設的一級字型檔是採用的拼音排序方式,而二級字型檔中的漢字預設卻是採用的部首筆劃的順序排列的。在此將網路上關於漢字的一級字型檔和二級字型檔資訊的資料做一個小小的總結。
為了使每一個漢字有一個全國統一的代碼,1980年,我國頒布了第一個漢字編碼的國家標準: GB2312-80《資訊交換用漢字編碼字元集》基本集,這個字元集是我國中文資訊處理技術的發展基礎,也是目前國內所有漢字系統的統一標準。由於國標碼是四位十六進位,為了便於交流,大家常用的是四位十進位的區位碼。所有的國標漢字與符號組成一個94×94的矩陣。在此方陣中,每一行稱為一個"區",每一列稱為一個"位",因此,這個方陣實際上組成了一個有94個區(區號分別為0
1到94)、每個區內有94個位(位號分別為01到94)的漢字字元集。一個漢字所在的區號和位號簡單地組合在一起就構成了該漢字的"區位碼"。在漢字的區位碼中,高兩位為區號,低兩位為位號。 在區位碼中,01-09區為682個特殊字元,16~87區為漢字區,包含6763個漢字 。其中16-55區為一級漢字(3755個最常用的漢字,按拼音字母的次序排列),56-87區為二級漢字(3008個漢字,按部首次序排列)。
漢字的內碼用兩個位元組。每個位元組都是從160十進位(A0十六進位,10100000二進位)開始,也就是兩個高位位1表示是內碼。高位元組對應區位碼中的區碼,低位元組對應區位碼中的位碼。
由於低位元組從10100000開始,這樣一個區就只能表示95個字,又由於區位碼中的位碼是從1開始的,這樣內碼低位元組表示位碼是從10100001(161)開始,就只能表示94個字,這正對應區位碼中的每區94個漢字。
一個漢字內碼與區位碼的關係是:
十進位
內碼高位元組=區碼+160 內碼低位元組=位碼+160
十六進位
內碼高位元組=區碼+A0 內碼低位元組=位碼+A0
由於漢字的區碼是從16開始的,16+160=176,這樣漢字的內碼的高位元組就是從176開始的,得到一個規律:
因此要判斷一個字元是否是漢字的方法(對於Unicode字元,因為它是用兩個位元組表示一個字元,也是現在編程較常用的表示和存放字元的方法):
讀出字元的高位元組,將其轉換位十進位,然後判斷其是否大於等於(>=)176,如果是就表示它是漢字。
如果為了可靠,可以在判斷完高位元組後,再讀出低位元組,將其轉換位十進位,然後判斷其是否大於(>)160,如果是就表示它是漢字。