CodeIgniter使用CSV库导出阿拉伯语乱码问题求助
解决CSV导出阿拉伯字符乱码的有效方案
1. 确保数据库连接使用UTF-8编码
修改CodeIgniter数据库配置文件 application/config/database.php,设置兼容多语言的字符集:
$db['default']['char_set'] = 'utf8mb4'; $db['default']['dbcollat'] = 'utf8mb4_unicode_ci';
注:utf8mb4比传统utf8支持更多Unicode字符,更适合阿拉伯语这类非拉丁语系场景。
2. 添加UTF-8 BOM头(适配Windows Excel)
Windows下的Excel默认无法识别无BOM的UTF-8 CSV,需在输出前添加BOM标记,同时完善响应头:
function exportCSV(){ $data = $this->m->excel($allocation, $category); $this->load->helper('csv'); // 输出UTF-8 BOM,让Excel正确识别编码 echo "\xEF\xBB\xBF"; // 明确设置下载文件名和编码 header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="Balance.csv"'); query_to_csv($data, TRUE, 'Balance.csv'); }
3. 自定义CSV导出函数(替代内置助手)
如果内置的query_to_csv未处理编码转换,可以自己实现导出逻辑,确保每个字段都是UTF-8:
function exportCSV(){ $data = $this->m->excel($allocation, $category); if(empty($data)) return; // 输出BOM和响应头 echo "\xEF\xBB\xBF"; header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename="Balance.csv"'); $output = fopen('php://output', 'w'); // 写入表头 fputcsv($output, array_keys($data[0])); // 遍历数据,统一转换为UTF-8 foreach($data as $row){ $utf8_row = array_map(function($val){ // 自动检测原编码并转为UTF-8 return mb_convert_encoding($val, 'UTF-8', 'auto'); }, $row); fputcsv($output, $utf8_row); } fclose($output); exit; }
4. 转换数据库中已有的非UTF-8字符
如果数据库存储的阿拉伯字符本身是其他编码(比如ISO-8859-6),在Model的excel方法里对数据转码:
function excel($allocation, $category){ // 原查询逻辑... $result = $this->db->get()->result_array(); // 转换每个字段为UTF-8 foreach($result as &$row){ foreach($row as &$value){ // 从ISO-8859-6转为UTF-8,根据实际编码调整 $value = mb_convert_encoding($value, 'UTF-8', 'ISO-8859-6'); } } return $result; }
内容的提问来源于stack exchange,提问作者Syam
相关产品推荐
相关产品推荐

