PHP中三位十六进制转字符串的问题求助
解决三位十六进制编码转字符串的问题
你的问题核心是当前转换函数仅支持两位十六进制(对应单字节ASCII或UTF-8单字节字符),但遇到的三位十六进制实际是省略前导0的Unicode码点(比如ă对应U+0103,简写为三位十六进制103;ţ对应U+0163,简写为163)。
以下是适配这种混合两位/三位十六进制的转换函数:
function mixedHexToStr($hex) { $string = ''; $length = strlen($hex); $i = 0; while ($i < $length) { // 优先匹配三位十六进制(对应≥256的Unicode码点) if ($i + 2 < $length) { $threeChars = substr($hex, $i, 3); $dec = hexdec($threeChars); // 三位十六进制最小为0x100=256,以此区分两位的0x00-0xFF if ($dec >= 256) { $string .= mb_chr($dec, 'UTF-8'); $i += 3; continue; } } // 处理常规两位十六进制 if ($i + 1 < $length) { $twoChars = substr($hex, $i, 2); $string .= chr(hexdec($twoChars)); $i += 2; } else { // 处理剩余单个十六进制字符(可选,按需调整) $string .= chr(hexdec($hex[$i])); $i++; } } return $string; }
函数说明
- 遍历字符串时,先检查当前位置是否可截取三位字符,若转换为十进制后≥256(即十六进制≥0x100),则判定为Unicode码点,用
mb_chr()转换为UTF-8字符。 - 不符合三位条件时,按常规两位十六进制处理,用
chr()转换为单字节字符。 - 额外处理了剩余单个字符的边界情况,避免遗漏。
测试示例
用你提供的十六进制串测试:
$hex = '7061726f6c65692070656e74727520636f6e74756c2064756d6e6561766f61737472103206120666f737420696e69163696174103'; echo mixedHexToStr($hex);
输出结果:
parolei pentru contul dumneavoastră a fost iniţiată
内容的提问来源于stack exchange,提问作者AdrianH
相关产品推荐
相关产品推荐

