php在网页上出现乱码
凌晨三点,页上我盯着屏幕上那排“锟斤拷锟斤拷”的出现字符,差点把键盘砸了。乱码用户上传的页上CSV文件,在网页上显示成一片乱码,出现后台数据库里存得清清楚楚的乱码中文,一到浏览器就变成天书。页上这种问题,出现十有八九是乱码编码不一致在捣鬼——文件是UTF-8,数据库是页上GBK,页面却声明成ISO-8859-1,出现三方各说各话,乱码浏览器只能瞎猜。页上 php本身不产生乱码,出现它只是乱码搬运工。真正的问题出在三个环节:文件存储编码、数据库连接编码、HTTP响应头。你写代码时用UTF-8保存,没问题;MySQL表用utf8mb4,也没问题;但php连接数据库时没执行 我见过最离谱的一次,是同事把php文件用记事本另存为,系统默认成了ANSI编码。整个文件里所有中文注释和字符串全变成问号。这种错误最坑——代码能跑,逻辑能通,就是输出全是“???”。后来我学乖了,编辑器一律强制UTF-8无BOM,保存前看一眼右下角编码提示,这习惯救了我无数次。 另一个高频雷区是HTTP头。你辛辛苦苦把页面输出调成UTF-8,结果php文件开头有个BOM头,或者前面有空格输出, 说说数据库那边。MySQL的 有个土办法我一直在用:在php文件顶部加三行保险—— 最后说个容易忽略的细节:文件上传下载时的文件名。用户上传“报告.docx”,你存到服务器后文件名变成“%E6%8A%A5%E5%91%8A.docx”,这就是URL编码。如果你用 乱码这东西,排查起来像破案。先确认文件本身编码,再查数据库连接,最后看HTTP头。三步走完,九成问题能定位。剩下的,多半是某个你看不见的隐藏字符在作怪。用十六进制编辑器打开php文件,看看开头有没有EF BB BF,那是BOM的痕迹。有就删掉,保存为无BOM格式,问题往往迎刃而解。别问我为什么知道这么多——都是被乱码逼出来的经验。SET NAMES utf8mb4,数据从MySQL取出来就变成latin1的字节流,再塞进UTF-8的页面里,不乱才怪。header('Content-Type: text/html; charset=utf-8')就失效了。浏览器检测不到声明,就按系统默认编码解析,中文立刻变成一团浆糊。更隐蔽的是,有些框架会自动加响应头,你再手动加一次,两个声明冲突,浏览器取后者,结果就看你代码顺序了。character_set_server和character_set_database不一致,或者表字段排序规则用了gbk_chinese_ci,而你PHP连接用UTF-8,取出来的数据在内存里就已经是错的。这时候你用mb_detect_encoding()去检测,它可能告诉你这是ASCII——因为字节流恰好符合ASCII范围,但实际是UTF-8编码的中文被截断了。这种错乱最恶心,因为数据进库时就已经损坏,不是输出环节能救回来的。ini_set('default_charset', 'UTF-8')、mb_internal_encoding('UTF-8')、mb_http_output('UTF-8')。虽然不能解决所有问题,但能挡掉八成粗心大意造成的乱码。剩下的两成,就得靠你在写SQL时用mysqli_set_charset($conn, 'utf8mb4'),或者PDO连接串里加charset=utf8mb4,把连接层编码钉死。urldecode()处理不当,或者浏览器端没做encodeURIComponent(),下载时文件名就会乱码。这不算严格意义的页面乱码,但用户看到的是同样的效果——一堆看不懂的字符。
-
上一篇
-
下一篇