CodeIgniter原生生成中文QR码需同时解决GD2字体缺失与UTF-8编码问题:必须显式指定真实中文字体路径(如FCPATH.'assets/fonts/msyh.ttf'),并用mb_convert_encoding()统一转UTF-8或base64_encode()封装内容,且文字绘制须脱离image_lib、改用imagettftext()等原生GD函数。

CodeIgniter 原生不支持中文 QR 码生成,直接传入中文字符串会显示乱码或空白,根本原因是底层 GD2 绘图时未加载中文字体,且 QR 编码前未做 UTF-8 → GBK 或 Base64 等兼容性转换。
GD2 绘图阶段必须显式指定中文字体文件路径
CodeIgniter 的 image_lib 不处理字体渲染,所有文字绘制依赖 PHP 的 imagettftext(),而该函数要求传入真实存在的 .ttf 文件路径——不能只写字体名(如 "simhei"),也不能依赖系统字体缓存。
- 把中文字体(如
msyh.ttf或NotoSansCJKsc-Regular.otf)放在assets/fonts/下 - 在绘图逻辑中硬编码完整路径:
FCPATH . 'assets/fonts/msyh.ttf' - 确保 Web 服务器用户对该文件有读取权限(常见坑:
chmod 644不够,有时需chown www-data:www-data) - 避免使用 Windows 路径风格(
C:\fonts\...),统一用FCPATH或APPPATH拼接
QR 数据编码前必须转为 UTF-8 并启用 ECI 模式(或 Base64 封装)
标准 QR 码规范对中文支持有限,多数轻量实现(如基于 qrCode() 辅助类的手动矩阵生成)默认按 ISO-8859-1 解码。不处理编码会导致字节截断或解析失败。
- 强制统一输入为 UTF-8:
mb_convert_encoding($text, 'UTF-8', 'auto') - 若使用自研 QR 矩阵算法,需在数据编码层启用 ECI(Extended Channel Interpretation)标识,例如插入字节序列
\x1D\x02\x54\x01表示 UTF-8 - 更稳妥的做法:将中文内容先
base64_encode(),生成 QR 后在扫码端解码——绕过字符集争议,兼容性最高 - 注意:
urldecode()或rawurldecode()不解决 QR 内容乱码,那是扫码器解析阶段的事
Image_lib 初始化后无法动态切换字体或编码方式
image_lib 是一次性配置型库,它只负责图像几何操作(缩放/裁剪/旋转),**不参与文字绘制**。很多人误以为调用 $this->image_lib->initialize($config) 就能控制字体,实际完全无效。
- 文字渲染必须脱离
image_lib,单独用 GD 原生函数:imagettftext()、imageftbbox() - 不能混用
imagecreate()和$this->image_lib实例——前者返回 resource,后者操作的是文件路径 - 常见错误:
Call to undefined function imagettftext(),说明 PHP 编译时没启用--with-freetype-dir - 验证方式:运行
php -m | grep freetype,或查看phpinfo()中 “FreeType Support” 是否为 enabled
最易被忽略的点是:即使字体路径正确、编码转换到位,如果 GD 图像资源创建时宽高不足以容纳中文字体渲染区域(尤其是多行中文),imagettftext() 会静默失败——既不报错也不出图。务必用 imageftbbox() 预估尺寸并留足边距。











