如何解决PHP读取CSV文件时UTF-8字符显示异常的问题
PHP读取CSV文件UTF-8字符显示异常解决方案
问题原因
原有代码存在两处核心问题导致乱码:
- 编码转换逻辑位置错误:转码操作放在了文件读取、内容输出完成之后,实际输出到页面的内容没有经过任何编码转换处理,末尾的
mb_convert_encoding和str_getcsv逻辑完全没有生效 - 未提前声明输出页面的编码格式,浏览器会使用默认编码解析内容,进一步提升了乱码概率
修复步骤
- 首先在所有输出之前声明页面编码为UTF-8,避免浏览器解析时编码不匹配
- 将编码转换逻辑移入
fgetcsv的循环内,每读取到一个字段就做转码处理后再输出 - 不要用
auto作为编码检测参数,自动检测准确率极低。你可以用文本编辑器(比如Notepad++)打开CSV文件,查看右下角标注的实际编码,常见的CSV编码包括GBK、GB2312、ISO-8859-9、UTF-8带BOM几种,明确填写到转码参数里即可
修复后完整代码
<?php // 声明页面编码为UTF-8,必须放在代码最顶部,不能有任何前置输出(包括空格、HTML标签) header('Content-Type: text/html; charset=utf-8'); $row = 1; if (($handle = fopen("Liste.csv", "r")) !== FALSE) { // 可选配置:如果你的CSV是UTF-8带BOM格式,保留以下三行去掉BOM头,否则可以删除 $bom = fread($handle, 3); if ($bom != pack("CCC",0xef,0xbb,0xbf)) { rewind($handle); } while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); echo "<p> $row satırındaki $num alan: <br /></p>\n"; $row++; for ($c=0; $c < $num; $c++) { // 第三个参数请替换为你CSV的实际编码,比如GBK、ISO-8859-9等 echo mb_convert_encoding($data[$c], "UTF-8", "GBK") . "<br />\n"; } } fclose($handle); } ?>
注意事项
如果调整编码参数后仍有乱码,优先再次核对原CSV的实际编码,确保转码源参数填写正确即可。
内容的提问来源于stack exchange,提问作者Jagger
相关产品推荐
相关产品推荐

