package com;
import java.io.UnsupportedEncodingException;
import java.util.Random;
/**
* 生成随机汉字
*
* @author wxhntmy
* @date 2023年6月23日
*/
public class Main {
/**
* Unicode编码汉字的起始位置
*/
private final static int START_INDEX = 0x4e00;
/**
* Unicode编码汉字的结束位置
*/
private final static int END_INDEX = 0x9fa5;
/**
* 汉字个数
*/
private final static int DELTA = END_INDEX - START_INDEX + 1;
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(getRandomChar(3));
System.out.println(getRandomHan(3));
System.out.println(getRandomChinese(3));
System.out.println(getRandomJianHan(3));
}
/**
* 方法一,Unicode
*
* @param len 生成的汉字字符个数
*
* @return 生成的随机汉字字符串
*/
public static String getRandomChar(int len) {
if (len <= 0) {
return null;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++) {
char han = (char) (START_INDEX + (int) (Math.random() * (DELTA)));
sb.append(han);
}
return sb.toString();
}
/**
* 方法二,Unicode
*
* @param len 生成的汉字字符个数
*
* @return 生成的随机汉字字符串
*/
public static String getRandomHan(int len) {
if (len <= 0) {
return null;
}
Random ran = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++) {
char han = (char) (START_INDEX + ran.nextInt(DELTA));
sb.append(han);
}
return sb.toString();
}
/**
* 方法三,GB2312
*
* @param len 生成的汉字字符个数
*
* @return 生成的随机汉字字符串
*/
public static String getRandomChinese(int len) {
if (len <= 0) {
return null;
}
/// 随机数
Random random = new Random();
String[] rBase = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++) {
// 生成第1位的区码
// 生成11到14之间的随机数
int r1 = random.nextInt(3) + 11;
String str_r1 = rBase[r1];
// 生成第2位的区码
int r2;
if (r1 == 13) {
// 生成0到7之间的随机数
r2 = random.nextInt(7);
} else {
// 生成0到16之间的随机数
r2 = random.nextInt(16);
}
String str_r2 = rBase[r2];
// 生成第1位的位码
// 生成10到16之间的随机数
int r3 = random.nextInt(6) + 10;
String str_r3 = rBase[r3];
// 生成第2位的位码
int r4;
if (r3 == 10) {
// 生成1到16之间的随机数
r4 = random.nextInt(15) + 1;
} else if (r3 == 15) {
// 生成0到15之间的随机数
r4 = random.nextInt(15);
} else {
// 生成0到16之间的随机数
r4 = random.nextInt(16);
}
String str_r4 = rBase[r4];
// 将生成机内码转换为汉字
byte[] bytes = new byte[2];
// 将生成的区码保存到字节数组的第1个元素中
String str_r12 = str_r1 + str_r2;
int tempLow = Integer.parseInt(str_r12, 16);
bytes[0] = (byte) tempLow;
// 将生成的位码保存到字节数组的第2个元素中
String str_r34 = str_r3 + str_r4;
int tempHigh = Integer.parseInt(str_r34, 16);
bytes[1] = (byte) tempHigh;
String ctmp = "";
try {
// 根据字节数组生成汉字
ctmp = new String(bytes, "GB2312");
} catch (UnsupportedEncodingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
sb.append(ctmp);
}
return sb.toString();
}
/**
* 方法四, GBK
*
* @param len 生成的汉字字符个数
* @return 生成的随机汉字字符串
*/
public static String getRandomJianHan(int len) {
if (len <= 0) {
return null;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++) {
String str = null;
// 定义高低位
int hightPos, 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] = (new Integer(hightPos).byteValue());
b[1] = (new Integer(lowPos).byteValue());
try {
str = new String(b, "GBK"); // 转成中文
} catch (UnsupportedEncodingException ex) {
ex.printStackTrace();
}
sb.append(str);
}
return sb.toString();
}
}