为什么使用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
相关产品推荐
相关产品推荐

