汉字以两个字节存储,称为“区位码”,高位叫区码,低位叫位码,有这俩字节组成汉字。假设有一张汉字表,横竖都是 94列,那么区码就相当于行,位码就相当于列,根据行列就可以确定一个汉字了,这有点像二位数组==,GB2312大致就是按照这种方式实现的,区码1~9即前9行放的是特殊字符,16~55区放的是一级汉字,56~87区放的是二级汉字,其余的暂时空余。为了区别中文与西文字母,在中文字符首位以1开头区分以0开头的ASCII码,GB2312给每个中文字符加上0xA0,因此,区码从0xB0-0xF7 都是汉字,位码范围0xA0-0xFE 。

 汉字的unicode范围是:0x4E00~0x9FA5

 汉字一、二级字库的汉字与unicode编码(十六进制)对照表: https://blog.csdn.net/zhoukejun/article/details/1937372

 第一种方法: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个汉字:

 \"\"

 

收藏 打印