天天看點

實作随機生成漢字的Java代碼

一、背景知識

GB 2312-80 是中國國家标準簡體中文字元集,全稱《資訊交換用漢字編碼字元集·基本集》,由中國國家标準總局釋出,1981年5月1日實施。GB2312 編碼通行于中國大陸;新加坡等地也采用此編碼。中國大陸幾乎所有的中文系統和國際化的軟體都支援 GB 2312。

GB2312 标準共收錄 6763 個漢字,其中一級漢字 3755 個,二級漢字 3008 個;同時收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西裡爾字母在内的 682 個字元。GB2312 的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆寫中國大陸 99.75% 的使用頻率。對于人名、古漢語等方面出現的罕用字,GB2312 不能處理,這導緻了後來 GBK 及 GB18030 漢字字元集的出現。

GB2312 中對所收漢字進行了“分區”處理,每區含有 94 個漢字/符号。這種表示方式也稱為區位碼。

01 - 09 區為特殊符号。

16 - 55 區為一級漢字,按拼音排序。

56 - 87 區為二級漢字,按部首/筆畫排序。

10 - 15 區及 88 - 94 區則未有編碼。舉例來說,“啊”字是 GB2312 之中的第一個漢字,它的區位碼就是 1601。

每個漢字及符号以兩個位元組來表示。第一個位元組稱為“高位位元組”,第二個位元組稱為“低位位元組”。“高位位元組”使用了 0xA1 - 0xF7(把 01 - 87 區的區号加上 0xA0),“低位位元組”使用了 0xA1 - 0xFE(把 01 - 94 位的位号加上 0xA0)。 由于一級漢字從 16 區起始,漢字區的“高位位元組”的範圍是 0xB0 - 0xF7,“低位位元組”的範圍是 0xA1 - 0xFE,占用的碼位是 72 * 94 = 6768。其中有 5 個空位是 D7FA - D7FE。例如“啊”字在大多數程式中,會以兩個位元組,0xB0(第一個位元組)0xA1(第二個位元組)儲存。(與區位碼對比:0xB0 = 0xA0 + 16, 0xA1 = 0xA0 + 1)。

國家标準 GB 18030-2005《資訊技術 中文編碼字元集》,是中華人民共和國現時最新的内碼字集,與 GB 2312-1980 完全相容,與 GBK 基本相容,支援 GB 13000 及 Unicode 的全部統一漢字,共收錄漢字 70244 個。現行版本為國家品質監督檢驗總局和中國國家标準化管理委員會于2005年11月8日釋出,2006年5月1日實施,為在中國境内所有軟體産品支援的強 制标準。

(以上資料來源于“維基百科”)

二、随機生成常用漢字的 C# 程式

建立Java項目,建立代碼片段:

import java.io.UnsupportedEncodingException;
import java.util.Random;
/**

随機生成常見的漢字

@author xuliugen
*/
public class GeneCharTest {
 public static void main(String[] args) {

 for (int i = 1; i < 24; i++) {
     System.out.print(getRandomChar() + "  ");
 }
 
}
private static char getRandomChar() {

 String str = "";
 int hightPos; //
 int lowPos;

 Random random = new Random();

 hightPos = (176 + Math.abs(random.nextInt(39)));
 lowPos = (161 + Math.abs(random.nextInt(93)));

 byte[] b = new byte[2];
 b[0] = (Integer.valueOf(hightPos)).byteValue();
 b[1] = (Integer.valueOf(lowPos)).byteValue();

 try {
     str = new String(b, "GBK");
 } catch (UnsupportedEncodingException e) {
     e.printStackTrace();
     System.out.println("錯誤");
 }

 return str.charAt(0);
 
}
}</pre>            

複制