首页 > 编程语言 >PHP 生成随机中文汉字 gb2312转utf8

PHP 生成随机中文汉字 gb2312转utf8

时间:2022-08-26 17:12:50浏览次数:90  
标签:编码 字节 0xD7 utf8 gb2312 汉字 随机 PHP

学习记录 留作参考
祝君好运

参考:信息交换用汉字编码字符集 基本集 GB/T 2312-1980

有些情况下需要生成一些随机汉字,参考了一些网上一些方法,感觉有些模糊。
于是找到了 gb2312 的具体参考文件,然后整理了下面的代码。

/**
 * 获取指定数量的随机汉字
 * @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 所指定的单个字符

性能

使用PHP 7.3.4 在命令行下直接运行,生成一万字符,耗时 0.0018s 左右。
返回常用汉字时,性能稍微好一点点,不过可以忽略不计了。

标签:编码,字节,0xD7,utf8,gb2312,汉字,随机,PHP
From: https://www.cnblogs.com/liulog/p/16628136.html

相关文章