phpqrcode生成中文乱码需先将字符串转utf-8编码,如mb_convert_encoding($text, 'utf-8', 'auto');参数顺序为qrcode::png($text, $outfile, $level, $size, $margin),容错等级推荐qr_eclevel_h(30%),模块大小设3–4,边框至少2;输出前必须header('content-type: image/png')且无任何前置输出。

phpqrcode 生成二维码时中文乱码怎么办
默认不指定编码,QRcode::png() 会把中文当成 ISO-8859-1 处理,直接显示方块或问号。根本原因是 phpqrcode 本身不处理字符编码转换,它只负责把输入的字节流画成二维码。
解决方法是手动将中文字符串转为 UTF-8 编码后再传入:
- 如果原始数据来自 $_GET 或表单,先用
mb_convert_encoding($str, 'UTF-8', 'AUTO')统一转码 - 若内容含 GBK/GB2312 字符(如旧系统导出),用
iconv('GBK', 'UTF-8//IGNORE', $str) - 避免直接拼接未转码的
$_GET['q']到QRcode::png()第一个参数
示例:
$data = isset($_GET['q']) ? $_GET['q'] : '默认文本'; $data = mb_convert_encoding($data, 'UTF-8', 'AUTO'); QRcode::png($data, false, QR_ECLEVEL_L, 4, 2);
如何控制二维码尺寸和容错等级
QRcode::png() 的第 3、4、5 个参数分别对应容错等级、模块大小、边框宽度,它们直接影响扫码成功率和渲染效果。
- 容错等级选
QR_ECLEVEL_L(约 7% 恢复能力)适合纯数字/短链接;含汉字或长文本建议用QR_ECLEVEL_H(30%) - 模块大小(第 4 参数)设为
3或4比较稳妥;小于2在手机上容易扫不出 - 边框宽度(第 5 参数)至少为
2,否则部分扫码器会因缺乏空白区而失败
注意:增大模块尺寸会放大整个图像,但不提升信息容量——内容超长时优先调高容错等级,而非盲目加 size。
为什么生成的二维码图片无法直接浏览器访问
常见错误是脚本里调用了 QRcode::png() 但没设置正确的 HTTP 头,导致浏览器把它当 HTML 解析,显示一堆乱码字符。
- 必须在输出二维码前加
header('Content-Type: image/png'); - 确保该行之前没有任何输出(包括空格、BOM、
echo、警告信息),否则报 “Headers already sent” - 如果想保存到文件而不是输出,把第二个参数设为具体路径,例如
QRcode::png($data, 'qrcode.png', ...)
调试技巧:临时注释掉 QRcode::png(),用 var_dump(headers_sent()) 确认是否已有输出。
phpqrcode 在 PHP 8+ 中报 Fatal error 怎么办
原版 phpqrcode(v1.1.9 及更早)依赖已废弃的 imagecreatefrompng() 等函数,在 PHP 8.0+ 里可能因 GD 扩展变更或严格错误报告而崩溃。
- 检查是否启用了
gd扩展:php -m | grep gd - 升级到社区维护分支,比如 briceburg/phpqrcode,它修复了 PHP 8 兼容性问题
- 若必须用老版本,可在调用前临时关闭严格报错:
error_reporting(E_ALL & ~E_DEPRECATED);
另外,新版 PHP 对 getimagesize() 返回结构有调整,某些自定义 logo 合成逻辑也会失效——这类细节容易被忽略,但会导致二维码生成后缺角或偏移。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











