You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

函数说明

  1. 遍历字符串时,先检查当前位置是否可截取三位字符,若转换为十进制后≥256(即十六进制≥0x100),则判定为Unicode码点,用mb_chr()转换为UTF-8字符。
  2. 不符合三位条件时,按常规两位十六进制处理,用chr()转换为单字节字符。
  3. 额外处理了剩余单个字符的边界情况,避免遗漏。

测试示例

用你提供的十六进制串测试:

$hex = '7061726f6c65692070656e74727520636f6e74756c2064756d6e6561766f61737472103206120666f737420696e69163696174103';
echo mixedHexToStr($hex);

输出结果:

parolei pentru contul dumneavoastră a fost iniţiată

内容的提问来源于stack exchange,提问作者AdrianH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 08:35:40