汉字以两个字节存储,称为“区位码”,高位叫区码,低位叫位码,有这俩字节组成汉字。假设有一张汉字表,横竖都是 94列,那么区码就相当于行,位码就相当于列,根据行列就可以确定一个汉字了,这有点像二位数组==,GB2312大致就是按照这种方式实现的,区码1~9即前9行放的是特殊字符,16~55区放的是一级汉字,56~87区放的是二级汉字,其余的暂时空余。为了区别中文与西文字母,在中文字符首位以1开头区分以0开头的ASCII码,GB2312给每个中文字符加上0xA0,因此,区码从0xB0-0xF7 都是汉字,位码范围0xA0-0xFE 。
汉字的unicode范围是:0x4E00~0x9FA5
第一种方法:unicode编码
public static char getRandomChar(){
return (char) (0x4e00 +(int)(Math.random()*(0x9fa5- 0x4e00+1))) ;
}
第二种方法:区位码
/**
* 汉字以两个字节存储,称为“区位码”,高位叫区码,低位叫位码,有这俩字节组成汉字
* @return
*/
private static char getRandomChar2() {
String str = "";
//随机数对象
Random random = new Random();
///区码,0xA0打头,从第16区开始,即0xB0=11*16=176,16~55一级汉字,56~87二级汉字
int hightPos = (176 + Math.abs(random.nextInt(39)));
//位码,0xA0打头,范围第1~94列
int 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);
}
测试产生20个汉字: