You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么使用mb_convert_encoding转换编码时会额外输出问号?

问题原因
  • 转换后自带BOM头:调用mb_convert_encoding($output, 'UTF-16', 'UTF-8')时,使用无大小端标识的UTF-16作为目标编码,函数会默认在转换结果开头插入2字节的UTF-16字节顺序标记(BOM,对应Unicode字符U+FEFF),用于标识编码的字节序。
  • 浏览器编码解析错误:你没有为HTTP响应设置正确的编码声明,浏览器默认按UTF-8(或系统默认的兼容ASCII的编码)解析返回内容。UTF-16的2字节BOM不属于UTF-8的合法字节序列,会被浏览器替换为�占位符,也就是你看到的多余乱码。
  • 命令行运行正常的原因:主流终端工具会自动识别内容中的BOM标记,主动切换为对应编码解析,同时不会将BOM作为可见字符渲染,因此显示结果符合预期。
修复方案
  • 若确实需要输出UTF-16编码内容,在输出前添加HTTP编码声明头,告知浏览器使用对应编码解析:
header('Content-Type: text/plain; charset=UTF-16');
$output = '<hello';
echo mb_convert_encoding( $output, 'UTF-16', 'UTF-8' );
  • 若不需要BOM标记,可指定明确的UTF-16大小端编码,转换时就不会自动生成BOM:
// 输出UTF-16大端序,无BOM
echo mb_convert_encoding( $output, 'UTF-16BE', 'UTF-8' );
// 输出UTF-16小端序,无BOM
echo mb_convert_encoding( $output, 'UTF-16LE', 'UTF-8' );
  • 若无特殊编码要求,直接输出UTF-8内容即可,无需做编码转换。

内容的提问来源于stack exchange,提问作者Aurel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:42:00