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

PHP hex2bin转换非ASCII字符出现乱码,寻求解决办法

问题根源:编码不匹配导致乱码

你遇到的核心问题是前后端编码逻辑不统一:

  • 前端用charCodeAt(0)拿到的是字符的UTF-16码点,但£、®这类字符在UTF-8编码中是双字节(£对应c2a3,®对应c2ae),你只提取了单个字节的十六进制值(a3、ae),这本质是ISO-8859-1编码,并非UTF-8。
  • 后端hex2bin将十六进制转成字节流后,浏览器以UTF-8解析这些非UTF-8字节,自然会显示乱码�。

正确解决方案

1. 前端:将字符串转成UTF-8字节再生成十六进制

放弃charCodeAt,改用TextEncoder API直接把字符串编码为UTF-8字节数组,再转换为十六进制:

// 字符串转UTF-8十六进制工具函数
function stringToUtf8Hex(str) {
  const encoder = new TextEncoder();
  const utf8Bytes = encoder.encode(str);
  // 每个字节转两位十六进制,拼接成最终字符串
  return Array.from(utf8Bytes, byte => byte.toString(16).padStart(2, '0')).join('');
}

// 测试示例
const testStr = '£®$';
const hexResult = stringToUtf8Hex(testStr);
console.log(hexResult); // 输出 c2a3c2ae24

2. 后端:转字节并确保UTF-8输出

后端用hex2bin转成字节流后,只需确保输出时指定UTF-8编码(全局设置或通过header),即可正常显示:

// 接收前端传来的十六进制字符串
$hexData = 'c2a3c2ae24';
// 转换为UTF-8字节流
$utf8Str = hex2bin($hexData);

// 确保输出编码为UTF-8(若项目未全局设置)
header('Content-Type: text/html; charset=utf-8');
echo $utf8Str; // 正确显示 £®$

兼容旧浏览器的替代方案

如果需要兼容不支持TextEncoder的旧环境,可通过encodeURIComponent间接转换:

function stringToUtf8HexLegacy(str) {
  return encodeURIComponent(str)
    .replace(/%([0-9A-F]{2})/g, (match, p1) => p1.toLowerCase());
}

console.log(stringToUtf8HexLegacy('£®')); // 输出 c2a3c2ae

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 05:13:11