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

PHP中UTF-16转ASCII问题:十六进制串转「浪」emoji失败

解决PHP中将UTF-16十六进制字符串转换为「浪」emoji的问题

先帮你理清核心问题:你手里的十六进制字符串d83edd2a是**UTF-16BE(大端字节序)**编码的「浪」emoji(对应Unicode码点U+1F30A),hex2bin()只是单纯把十六进制转成字节流,没做编码转换,所以PHP默认按UTF-8解析这些字节时就会显示乱码。

正确处理步骤

你需要先把十六进制转成字节流,再将这个字节流从UTF-16BE编码转换为PHP能正常输出的UTF-8编码,这里有两种可靠方法:

方法1:使用mb_convert_encoding()

$hex_str = 'd83edd2a';
// 把十六进制转成UTF-16BE字节流
$utf16_bytes = hex2bin($hex_str);
// 将UTF-16BE字节流转换为UTF-8
$emoji = mb_convert_encoding($utf16_bytes, 'UTF-8', 'UTF-16BE');

echo $emoji; // 输出:🌊

方法2:使用iconv()

$hex_str = 'd83edd2a';
$emoji = iconv('UTF-16BE', 'UTF-8', hex2bin($hex_str));

echo $emoji; // 输出:🌊

为什么之前的尝试会失败?

  • 你用hex2bin()得到的Ø>Ý*,是UTF-16BE字节流被错误当成UTF-8解析的结果,这完全符合预期——两种编码的字节规则差异很大,解析错误自然会出现乱码。
  • 其他方法返回????,大概率是转换时指定了错误的源编码(比如误用UTF-16LE而非UTF-16BE),或者没明确指定源编码,导致PHP无法识别字节流的编码格式,最终用替代字符表示无法解析的内容。

如果不确定字节序,也可以尝试UTF-16(让函数自动检测字节序标记BOM),不过你的十六进制没有BOM,所以明确指定UTF-16BE更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:15:13