PHP使用fwrite写入CSV文件时UTF-8编码异常求助
解决PHP写入CSV时的UTF-8乱码问题
这是典型的UTF-8编码未正确处理导致的乱码问题,尤其是在Windows环境下用Excel或记事本打开CSV时最容易出现这类字符错乱。我给你几个实用的修复方案,一步步帮你解决:
方案1:添加UTF-8 BOM头 + 确保输入输出编码统一
Windows系统下的很多软件(比如Excel)需要UTF-8文件带有BOM(字节顺序标记)才能正确识别编码,否则会把UTF-8解析成其他编码(比如GBK)导致乱码。同时要确保表单提交的内容本身是UTF-8格式。
修改后的PHP代码:
<?php if (isset($_POST['myname'])) { // 先确保提交的内容是UTF-8编码(兼容不同的输入编码) $name = mb_convert_encoding($_POST['myname'], 'UTF-8', mb_detect_encoding($_POST['myname'])); $file_path = 'names.csv'; $handle = fopen($file_path, 'a'); // 如果是新创建的空文件,写入UTF-8 BOM头 if (filesize($file_path) === 0) { fwrite($handle, "\xEF\xBB\xBF"); } // 使用\r\n作为换行符,兼容Windows和Unix系统 fwrite($handle, $name . "\r\n"); fclose($handle); } ?>
对应的HTML要加上编码声明,确保表单提交的内容是UTF-8:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <form method="post" action="demo.php"> Myname: <input type="text" name="myname" /> <input type="submit" name="submit" value="提交"> </form> </body> </html>
方案2:使用更规范的fputcsv函数写入CSV
fputcsv是PHP专门为写入CSV设计的函数,它能自动处理字段中的逗号、引号等特殊字符,避免CSV格式错误,同时配合编码处理也能解决乱码问题:
<?php if (isset($_POST['myname'])) { $name = mb_convert_encoding($_POST['myname'], 'UTF-8', mb_detect_encoding($_POST['myname'])); $file_path = 'names.csv'; $handle = fopen($file_path, 'a'); if (filesize($file_path) === 0) { fwrite($handle, "\xEF\xBB\xBF"); } // 把单个字段放进数组,fputcsv会自动处理CSV格式 fputcsv($handle, [$name]); fclose($handle); } ?>
额外注意事项
- 如果你是在Linux/macOS环境下,大部分文本编辑器不需要BOM也能识别UTF-8,但为了兼容Windows,加上BOM更稳妥。
- 可以检查PHP配置文件
php.ini中的default_charset是否设置为UTF-8,确保PHP默认输出编码正确。
内容的提问来源于stack exchange,提问作者TNX
相关产品推荐
相关产品推荐

