PHP使用hex2bin转换十六进制字符串出现乱码如何解决
问题根因
hex2bin() 直接解码得到的原始字节采用的是**Windows-1252(也叫CP1252,西欧地区常用的单字节编码)**编码,而非网页/终端默认的UTF-8编码,直接输出必然出现乱码。
你之前尝试的utf8_encode()、utf8_decode()本身就不适用当前场景:
utf8_encode()仅支持将ISO-8859-1编码的字符串转为UTF-8,无法识别Windows-1252中0x80-0x9F区间的特殊字符(你代码里的0x96对应长破折号–,正好在这个区间,ISO-8859-1中该位置是不可打印的控制字符,会被渲染为乱码替换符�)utf8_decode()作用是将UTF-8字符串转为ISO-8859-1,和你的转换需求完全相反,只会加重乱码。
核对字节映射可以完全匹配预期结果:0x96在Windows-1252编码中对应长破折号–,0xE1对应带尖音的小写字母á,和你给出的预期输出完全吻合。
修复代码
使用mb_convert_encoding()将解码后的原始字节从Windows-1252编码转为UTF-8即可,可直接运行的代码如下:
<?php $string = "52656C6F6A204E616D69209620534B4D4549209620416375E17469636F"; $productname = mb_convert_encoding(hex2bin($string), 'UTF-8', 'Windows-1252'); echo $productname;
运行效果
执行上述代码会直接输出你需要的预期结果:
Reloj Nami – SKMEI – Acuático
内容的提问来源于stack exchange,提问作者Club
相关产品推荐
相关产品推荐

