cp850转Unicode异常求助:mb_convert_encoding转换Ð为Ñ失败
问题原因与解决方案
这个问题我之前也碰到过,核心是对mb_convert_encoding的用法和编码对应关系理解有偏差,我来给你拆解清楚:
为什么会得到Ã?
这里有两个关键问题:
- 没指定原编码参数:
mb_convert_encoding的正确用法是mb_convert_encoding(字符串, 目标编码, 原编码),你只传了前两个参数,函数会默认使用PHP的内部编码(可以用mb_internal_get_encoding()查看)作为原编码。如果内部编码是UTF-8,那你相当于把UTF-8格式的Ð转成UTF-8,这完全不对。而你得到Ã的情况,说明你的输入字符串的实际编码并不是你以为的CP850。 - 编码对应关系搞混了:CP850编码里,十进制208(字节
0xD0)对应的字符是Ñ;但Ð这个字符是ISO-8859-1(Latin-1)编码里字节0xD0对应的字符。所以你大概率是把CP850的字节0xD0错误地用ISO-8859-1解码成了Ð,再去转码自然得不到正确结果。
正确的转换方法
根据你的场景,分两种情况处理:
情况1:你能拿到CP850编码的原始字节
如果你是从文件、数据库或其他来源直接获取到CP850的原始字节(比如字节0xD0),直接指定原编码为CP850即可:
// CP850编码中对应Ñ的原始字节 $cp850_byte = "\xD0"; // 转换为UTF-8 $utf8_ñ = mb_convert_encoding($cp850_byte, 'UTF-8', 'CP850'); echo $utf8_ñ; // 输出Ñ
情况2:你手里的字符串已经是Ð
如果你的输入已经显示为Ð,说明这个字符串是用ISO-8859-1解码CP850字节得到的,需要先转回到CP850字节,再转成UTF-8:
// 假设$str是ISO-8859-1编码的Ð $cp850_byte = mb_convert_encoding($str, 'CP850', 'ISO-8859-1'); $utf8_ñ = mb_convert_encoding($cp850_byte, 'UTF-8', 'CP850'); echo $utf8_ñ; // 输出Ñ
更直接的方式
如果你明确知道要转换的是CP850的208号字符,也可以直接用chr(208)获取对应字节再转码:
$utf8_ñ = mb_convert_encoding(chr(208), 'UTF-8', 'CP850'); echo $utf8_ñ; // 输出Ñ
内容的提问来源于stack exchange,提问作者colomborodrigo
相关产品推荐
相关产品推荐

