codeigniter 中文乱码需四步修复:一、配置 $config['charset']='utf-8' 且 $config['utf8_enabled']=true;二、数据库设 char_set='utf8'、dbcollat='utf8_general_ci';三、所有 php 文件保存为 utf-8 无 bom;四、ajax 提交前用 encodeuri/encodeuricomponent 编码中文参数。

确认 $config['charset'] 和数据库配置是否匹配
CodeIgniter 默认不强制 UTF-8,必须显式声明。如果只改 HTML 或 header 而忽略框架层配置,中文在表单提交、查询条件、购物车等环节仍会出错。
检查 application/config/config.php 中这两行:
$config['charset'] = 'UTF-8'; $config['utf8_enabled'] = TRUE;
同时确保数据库连接也用 UTF-8:
-
$db['default']['char_set'] = 'utf8';(注意是utf8,不是utf8mb4;CI 3.x 原生不支持utf8mb4) $db['default']['dbcollat'] = 'utf8_general_ci';
漏掉任一者,$this->db->like('name', '张三') 就可能查不到数据,因为传入的字符串被当成 Latin-1 解析了。
文件保存编码必须是 UTF-8 无 BOM
很多乱码问题其实和框架无关,而是编辑器把 PHP 文件存成了 GBK/GB2312 或 UTF-8 with BOM。CI 加载控制器或模型时,BOM 会被当作输出提前发送,导致 header 设置失效,后续 header("Content-type:text/html;charset=utf-8") 直接报“headers already sent”。
验证方式:用 Notepad++ 打开任意控制器,右下角看编码显示;若为“ANSI”或“UTF-8-BOM”,立刻转为“UTF-8 无 BOM”并保存。VS Code 用户需检查右下角编码按钮,点击后选 Save with Encoding → UTF-8。
特别注意:application/config/database.php 和 routes.php 这类配置文件一旦含 BOM,整个路由或 DB 初始化就可能静默失败。
AJAX 提交中文时必须手动编码 URL 参数
IE(尤其是 IE9–11)对非 ASCII URL 参数处理极差,而 CI 的 clean_string() 在 utf8_enabled == TRUE 下默认调用 iconv('UTF-8','UTF-8//IGNORE',$str),该函数在 IE 提交未编码的中文时会触发 Notice 并截断字符串。
前端必须做两件事:
- GET 请求参数用
encodeURI()包裹,例如:url: encodeURI('/search?q=' + keyword) - POST 请求若用原生
XMLHttpRequest或fetch,确保Content-Type是application/x-www-form-urlencoded且字段值已encodeURIComponent()
后端不用改 —— 只要前端编码了,CI 自动解码;但若跳过这步,$_POST['title'] 在 IE 下大概率是空或乱码。
邮件标题、导出 CSV 等特殊场景需绕过 CI 的自动编码
CI 的 Email 类对 subject 做 Q-Encoding,但遇到超长中文标题(比如 > 15 字)会拆分错误,最终收件箱显示为 “=?UTF-8?B?...?=” 后半截丢失。同理,用 csv_from_result() 导出含中文的 CSV,Excel 默认用 ANSI 打开,必然乱码。
解决方法不是关功能,而是精准干预:
- 发邮件时重写
subject()方法,直接用 Base64 编码:$subject = '=?' . $this->charset . '?B?' . base64_encode($subject) . '?='; - 导出 CSV 前,在输出前加 BOM 头:
echo "\xEF\xBB\xBF";,再输出内容,Windows Excel 就能正确识别 UTF-8
这些地方不走常规 HTTP 输出流程,$this->output->set_content_type() 完全无效,必须在字节流层面动手。











