导出CSV文件时泰米尔语字体乱码问题求助
解决CSV导出时泰米尔语乱码问题
泰米尔语导出CSV后显示乱码(如“தூதà¯à®¤à¯à®•à¯à®•à¯à®Ÿà®”),核心原因是多数CSV阅读器(如Excel)无法自动识别不带BOM的UTF-8编码,加上输出时的编码声明不够严谨。以下是针对性的修复方案:
关键修改点
- 写入CSV前添加UTF-8 BOM头,让阅读器正确识别编码
- 完善HTTP响应头的编码声明
- 确保数据库读取的内容编码正确
修改后的完整代码
mysqli_set_charset($db, "utf8mb4"); $query = $db->query("$reports"); if($query->num_rows > 0){ $delimiter = ","; $filename = "report_" . date('Y-m-d') . ".csv"; // Create a file pointer $f = fopen('php://memory', 'w'); // 写入UTF-8 BOM,让Excel等阅读器正确识别编码 fwrite($f, "\xEF\xBB\xBF"); // Set column headers $fields = array('Ticket No','Name','Phone','Zone','Ward','Street','Department','Category','Description','Asgn. Employee','Date','Overdue Date','Status Updated On','Status'); fputcsv($f, $fields, $delimiter); // Output each row of the data, format line as csv and write to file pointer while($row = $query->fetch_assoc()){ $lineData = array( $row['ticket_id'], $row['empname'], $row['COMP_MOB'], $row['zone_name'], $row['ward_name'], $row['ASSN_STREET'], $row['name'], $row['complaint_cat_name'], $row['DEPT_DESCRIPTION'], $row['emp_name'], $row['dateofsubmit'], $row['overdue'], $row['dateofupdate'], $row['STATUS'] ); fputcsv($f, $lineData, $delimiter); } // Move back to beginning of file fseek($f, 0); // Set headers to download file rather than displayed header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="' . $filename . '"'); // Output all remaining data on a file pointer fpassthru($f); } exit; ?>
额外说明
- UTF-8 BOM的作用:
"\xEF\xBB\xBF"是UTF-8的字节顺序标记,添加后Excel等工具会自动以UTF-8编码解析文件,避免乱码。 - Header优化:将
Content-Type改为text/csv; charset=utf-8,明确告知浏览器文件编码;移除了冗余的Content-Encoding(CSV是明文,不需要编码压缩声明)。 - 数据库编码确认:确保数据库表的字符集是
utf8mb4,且连接时mysqli_set_charset($db, "utf8mb4")生效,保证从数据库读取的泰米尔语内容是正确的UTF-8格式。
内容的提问来源于stack exchange,提问作者Kiran Kumar
相关产品推荐
相关产品推荐

