You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动