首先,我们得先提一个PHP语法:\u{}。比如:
[znl.pub ~ ]# php -r 'echo "\u{2440}".PHP_EOL;'
⑀
注意是我们是用的双引号,如果你用单引号,就不会转义而是直接输出 \u{2440};还有要注意就是花括号里的数是16进制数。接下来我就想:能不能设置一个16进制数的变量,让他自增加1,然后循环打印对应的unicode字符呢?那我们先来测试一下变量能不能组合后解析吧:
[znl.pub ~]# php -a
php > // 定义初始十六进制数
php > $a = "2440";
php > // 使用 \u{} 语法输出 Unicode 字符
php > echo "\u{$a}".PHP_EOL;
PHP Warning: Undefined variable $a in php shell code on line 1
php > echo "\u{{$a}}".PHP_EOL;
PHP Parse error: Invalid UTF-8 codepoint escape sequence in php shell code on line 1
php > echo "\u{" . $a . "}" . PHP_EOL;
PHP Parse error: Invalid UTF-8 codepoint escape sequence in php shell code on line 1
php > // 先设置成一个变量再试试?
php > $b="\u{".$a."}";
PHP Parse error: Invalid UTF-8 codepoint escape sequence in php shell code on line 1
php > $b="\u{".$a;
PHP Parse error: Invalid UTF-8 codepoint escape sequence in php shell code on line 1
php > $b="\u"."{".$a."}"; //这次没报错,抓紧echo 试试
php > echo $b;
\u{2440} // 显然又失败了
哎,难道就没有什么办法了吗?其实不然,php还有个杀手锏函数json_decode(),哈哈,毕竟他能将 \uXXXX 这种写法的unicode解码啊:
//紧接上段
php > echo json_decode('"\u2440"');
⑀
php > echo json_decode('"\u'.$a.'"');
⑀ // 成了
下面给出完整遍历可用代码:
<?php
// 定义初始十六进制数
$a = "2440";
// 循环次数
$maxIterations = 10000;
// 循环加1并打印结果
for ($i = 1; $i < $maxIterations; $i++) {
// 将十六进制数转换为十进制数
$b = hexdec($a);
// 加1
$b++;
// 将新的十进制数转换回十六进制数
$a = dechex($b);
// 输出 Unicode 字符
echo json_decode('"\u' . sprintf('%04s', $a) . '"') . PHP_EOL;
}
?>
说明:
sprintf('%04s', $a)
: 确保十六进制数字始终是四位,不足的用零填充。json_decode
: 解析 Unicode 字符串,确保正确输出。