mb_convert_encoding()函数在不同PHP版本(5.6与7.2)中输出结果不一致的技术咨询
嘿,我来帮你分析这个PHP版本间的差异问题,以及对应的解决办法:
为什么PHP 7.2里你的函数失效了?
主要原因是PHP 7.x系列中mb_convert_encoding的默认错误处理逻辑和PHP 5.6不一样了。在PHP 5.6里,当转换UTF-8到CP850时,像Ñ、Á这类特殊字符能被正确映射到CP850对应的编码;但到了PHP 7.2,默认的错误处理策略变成了忽略无法直接转换的字符——其实这些字符在CP850里是存在的,但可能因为mb_detect_encoding的严格检测逻辑微调,导致转换时的编码识别出现偏差,最终特殊字符被丢弃,变成了空白。
另外,PHP 7.2中mbstring扩展的内部默认编码设置和5.6不同,这也间接影响了转换的结果。
解决办法有这几种,你可以按需选:
1. 给mb_convert_encoding指定错误处理模式
既然你明确知道输入是UTF-8字符串,那就不用再调用mb_detect_encoding了,直接指定输入编码,并加上转写模式,确保特殊字符能被正确转换:
function console($utf8_string) { // TRANSLIT模式会把无法直接转换的字符转成近似的可显示字符 $dos = mb_convert_encoding($utf8_string, "CP850", "UTF-8", "TRANSLIT"); echo $dos; }
2. 改用iconv函数处理转换
iconv的字符转写逻辑相对更稳定,对于这类控制台编码转换场景表现更好:
function console($utf8_string) { $dos = iconv("UTF-8", "CP850//TRANSLIT", $utf8_string); echo $dos; }
3. 直接输出UTF-8,切换控制台编码
如果你的Windows控制台支持UTF-8,也可以先切换控制台编码,然后直接输出UTF-8字符串,省掉转换步骤:
// 先把控制台编码改成UTF-8(Windows专属命令) exec('chcp 65001'); function console($utf8_string) { echo $utf8_string; }
注意:这种方式需要把控制台字体换成支持UTF-8的,比如Consolas或者微软雅黑,不然可能会显示乱码。
内容的提问来源于stack exchange,提问作者Carles Serra




