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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:31:51