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
相关产品推荐
相关产品推荐

