PHP读取本地文件中文乱码需统一编码:先用Notepad++确认文件编码(如GBK或UTF-8-BOM),再用mb_convert_encoding、iconv或stream_filter_append转换为UTF-8,或直接将文件保存为UTF-8无BOM格式。

如果PHP读取本地文件时出现中文乱码,通常是由于文件保存的字符编码与PHP脚本中使用的编码不一致所致。以下是解决此问题的步骤:
一、确认文件实际编码格式
文件可能以UTF-8(含BOM或无BOM)、GBK、GB2312等编码保存,而PHP默认按字节流读取,未做编码转换会导致显示异常。需先识别原始文件编码,再针对性处理。
1、使用Notepad++打开目标文件,查看右下角状态栏显示的编码类型。
2、若显示为ANSI,在简体中文Windows系统中通常对应GBK编码。
立即学习“PHP免费学习笔记(深入)”;
3、若显示为UTF-8-BOM,注意BOM头可能影响字符串处理逻辑。
二、使用mb_convert_encoding进行编码转换
该函数可在读取后将内容从源编码转为目标编码(如UTF-8),适用于已知原始编码的情况。
1、用file_get_contents读取原始字节流。
2、调用mb_convert_encoding对内容执行转换,指定源编码和目标编码。
3、设置内部编码为UTF-8:mb_internal_encoding("UTF-8");。
4、示例代码:echo mb_convert_encoding(file_get_contents('test.txt'), 'UTF-8', 'GBK');
三、使用iconv函数转换编码
iconv是PHP内置的编码转换扩展函数,支持多种编码映射,对GBK与UTF-8互转兼容性较好。
1、检查iconv扩展是否启用:var_dump(extension_loaded('iconv'));
2、读取文件内容后调用iconv,格式为iconv("原编码", "目标编码//IGNORE", $content)。
3、//IGNORE参数可跳过无法转换的字符,避免报错中断。
4、示例代码:$content = iconv('GBK', 'UTF-8//IGNORE', file_get_contents('data.txt'));
四、以指定编码方式打开文件流
使用fopen配合stream_filter_append,可在读取过程中实时转码,减少内存占用并避免一次性加载大文件出错。
1、以二进制模式打开文件:$fp = fopen('log.txt', 'rb');
2、添加转换过滤器:stream_filter_append($fp, 'convert.iconv.GBK/UTF-8');
3、逐行读取:while (($line = fgets($fp)) !== false) { echo $line; }。
4、关闭文件句柄:fclose($fp);。
五、统一文件保存为UTF-8无BOM格式
从源头规避问题,将所有待读取的文本文件保存为UTF-8无BOM格式,使PHP无需额外转码即可正确解析。
1、在Notepad++中打开文件,选择“编码 → 转为UTF-8无BOM格式”。
2、保存文件。
3、PHP脚本中直接使用file_get_contents或fread读取,无需转换。
4、验证方式:var_dump(bin2hex(substr(file_get_contents('fixed.txt'), 0, 3))); // 应输出'efbbbf'表示有BOM,无BOM则前三位非此值











