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

PHP使用file_get_contents读取HTML文件出现编码乱码求助

解决PHP读取UTF-16编码HTML文件的乱码问题

我之前也碰到过类似的编码踩坑经历,尤其是处理UTF-16这类双字节编码的文件时,稍不注意就会出现你看到的�乱码符号。咱们来拆解问题根源,一步步解决:

问题核心原因

你提到Atom自动检测HTML文件是UTF-16 LE编码,这类编码以双字节存储字符,而且通常会带BOM(字节顺序标记)——也就是文件开头的FF FE字节。直接用file_get_contents读取后,BOM会被当成普通字符保留,加上你之前转码时要么指定了错误的源编码,要么没处理BOM,才导致乱码始终无法清除。

正确的解决方案

方案1:手动处理BOM + 指定正确编码转码

先移除UTF-16 LE的BOM,再从UTF-16 LE转成UTF-8:

$file_to_load = "index.html";
// 读取原始文件内容
$raw_content = file_get_contents($file_to_load);

// 检查并移除UTF-16 LE的BOM(开头的FF FE字节)
if (substr($raw_content, 0, 2) === "\xFF\xFE") {
    $raw_content = substr($raw_content, 2);
}

// 从UTF-16 LE编码转换为UTF-8
$html_page = mb_convert_encoding($raw_content, 'UTF-8', 'UTF-16LE');

echo $html_page;

方案2:利用流过滤器自动转码

PHP的流过滤器可以直接在读取时完成编码转换,同时自动处理BOM:

$file_to_load = "index.html";
$handle = fopen($file_to_load, 'rb');

// 给流添加UTF-16LE转UTF-8的过滤器
stream_filter_append($handle, 'convert.iconv.UTF-16LE/UTF-8');

$html_page = stream_get_contents($handle);
fclose($handle);

echo $html_page;

为什么之前的尝试失败?

  • 你用mb_convert_encoding($html_page , 'UTF-8' , 'UTF-8')相当于没有做任何转码操作,自然解决不了问题;
  • 即使指定了UTF-16,但没区分LE(小端)和BE(大端),或者没处理BOM,开头的BOM字节会被解析成乱码符号�或??。

额外建议

如果可以的话,尽量把HTML文件保存为UTF-8无BOM编码,这是Web开发的通用编码标准,后续处理会省心很多,避免各种编码兼容问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:45