PHP 生成随机中文汉字 gb2312转utf8
学习记录 留作参考
祝君好运
有些情况下需要生成一些随机汉字,参考了一些网上一些方法,感觉有些模糊。
此处打算使用拼凑gb2312编码的汉字,然后转换成utf8编码的返回。
于是找到了 gb2312 的具体参考文件,然后整理了下面的代码。
// 简单使用
function simpleFunc($num = 1000)
{
$str = '';
for ($i = 1; $i < $num; ++$i) {
$str .= chr(mt_rand(0xB0, 0xD6)) . chr(mt_rand(0xA1, 0xFE)); // 拼凑出一个汉字
}
return iconv('gb2312', 'utf-8', $str);
}
/**
* 方法的完全体
* 获取指定数量的随机汉字
* @param int $num 要返回汉字的数量
* @param bool $isCommonly 是否返回常用汉字(一级汉字)
* @return string
*/
function getRandWords($num = 1000, $isCommonly = true)
{
/**
* 通过查阅《信息交换用汉字编码字符集 基本集 GB/T 2312-1980》总结了一些内容如下:
* gb2312中的汉字编码为连续两个字节,前面的为第一字节,后面的为第二字节;
* 共收录汉字6763个,分成两级。第一级汉字3755个,第二级汉字3008个。
* 在国标文件的《图形字符编码表》中,全部汉字占用了一个 94*72 的矩阵,共计6768个格子,
* 中间有5个空白格,所以有效汉字对应为6763个。
* 空白格前面为3755个一级汉字,空白格后面为3008个二级汉字。
*/
/**
* 关于当前随机生成汉字方法的解释:
* 有效汉字的范围为:第一个字节为 0xB0 ~ 0xF7 ;第二个字节为 0xA1 ~ 0xFE
* 中间5个定义没有内容,分别为 0xD7,0xFA 0xD7,0xFB 0xD7,0xFC 0xD7,0xFD 0xD7,0xFE
*
* 要生成随机的gb2312编码的一个汉字,需要分别随机两个字节,即可拼凑成一个汉字
* 然后再将gb2312编码转化成utf-8编码,并返回
*
* 如果要随机全部汉字,则可能会随机到5个未定义内容,此时再调用转码函数时,会返回 false
* 故需要排除这些情况,
* 当然也可以不加判断,并逐字转换成utf8,成功则记录,失败则继续下一次循环。
*/
$str = '';
if ($isCommonly) {
for ($i = 1; $i < $num; ++$i) {
$str .= chr(mt_rand(0xB0, 0xD6)) . chr(mt_rand(0xA1, 0xFE));
}
} else {
for ($i = 1; $i < $num; ++$i) {
$hi = mt_rand(0xB0, 0xF7);
if ($hi === 0xD7) {
$low = mt_rand(0xA1, 0xFE);
} else {
$low = mt_rand(0xA1, 0xF9);
}
$str .= chr($hi) . chr($low); // 拼凑出一个gb2312编码的汉字
}
}
return iconv('gb2312', 'utf-8', $str); // 将gb2312编码的全部汉字转换为utf-8
}
函数参考
iconv() 字符串按要求的字符编码来转换
chr() 返回相对应于 ascii 所指定的单个字符
文档参考
信息交换用汉字编码字符集 基本集 GB/T 2312-1980
国际标准信息查询
性能
使用PHP 7.3.4 在命令行下直接运行,生成一万字符,耗时 0.0018s 左右。
返回常用汉字时,性能稍微好一点点,不过可以忽略不计了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通