先还原一下现场。
2026年6月21日晚上十点四十分,我坐在书房那台用了六年的ThinkPad前,屏幕上是某个只肯透露叫「老周」的读者下午发来的截图。截图里,一个标题栏本该显示中文的页面,整整齐齐地排着「1234」四个数字,后面跟着一串问号菱形方块,像是页面自己在骂人。老周在微信里就留了一句话:「叶子,我这边打开全是1234和方块,换了三个浏览器都一样。」 我回他「你先别急」,然后自己打开那个页面,结果——一样。满屏的1234,像谁在键盘上拿胶带把数字键粘住了。
愤怒,真的愤怒。不是气页面,是气这种烂问题永远没人一次说清楚。
我先说原因,再说解决。原因这块,我折腾到凌晨一点才摸清楚。第一个坑是字符集声明。那个页面的HTML头部写的是 charset="utf-8",但文件本身是别的编辑器用GBK保存的,两边打架,中文全变成数字和问号。你想啊,UTF-8的编码去解GBK的字节,解出来一堆控制字符,浏览器一渲染,就是1234这种噪声。第二个坑更气人,页面里有一段 JS 动态拼接字符串,拼接之后又经过一次本地转码,那个「1234」其实是转换后的占位符,原本应该是四个汉字,被硬硬生生吞掉了。第三个坑我跟你说出来都嫌丢人:服务器响应头里 Content-Type 后面少了 charset,有些浏览器就回退到默认编码,于是中文就集体阵亡。
简单说,三个源头:文件编码、动态内容转码、响应头缺声明。三件事叠在一起,才凑成这一屏1234。
再讲解决方法,我是一条条试过的,别急。第一,把源文件统一转成无BOM的UTF-8,我用VS Code打开,点右下角的编码,选「通过编码保存」,选UTF-8,保存,重新上传。第二,在 HTML 的 <head> 最前面加上 <meta charset="utf-8">,这个必须放在所有其它 meta 之前,我吃过亏,放后面有时候不生效。第三,服务器端如果是 Nginx,在 location 里补一句 charset utf-8;,如果是 Apache,就在 .htaccess 里写 AddDefaultCharset UTF-8。第四,那段 JS 拼接的代码,我让写后端的小刘把转码那两行删了,直接把原始字符串传给前端,一下子就正常了。
凌晨一点二十六分,页面刷新,中文回来了。我对着屏幕骂了一句「早干嘛去了」。
这里我得说句可能会挨骂的话:这类乱码问题,七成以上根本不是「编码太复杂」,而是有人图省事,文件编码、响应头、动态转码三个地方没对齐,还指望浏览器去猜。 浏览器不欠你的。我自己也干过这种蠢事,2019年做一个本地小站时,拿记事本另存为UTF-8,结果带BOM,首页顶上一行空白,查了我整整一个下午。所以我现在看到有人问「为什么我的页面是1234」,第一反应不是解释,是先让他把文件的十六进制头几个字节发过来。
你要问我最烦哪种情况?是那种改完之后一半正常一半乱码,那种才真的让人想把键盘撅了。
顺便说,排查过程中我还翻到几个以前存下的旧页面,有的现在还在那儿挂着,顺便贴出来,就当给同样在乱码里挣扎的人一点别的出路。比如之前记过的 日韩电影天堂影片网,里面的编码说明写得比某些教程清楚;还有 情窦初开2菲律宾 那个页面,我上次打开时倒是没乱码,但加载慢得像在等水烧开;另外像 小蓝爆料金主爸爸狂虐 这种标题,我纯粹是因为好奇点进去的,结果什么都没看懂,只记住了页面顶上一行正常的UTF-8声明;以及 亚洲免费mv欧美大片7788 那个,有一说一,加载出来的中文是正常的,我当时还专门右键看了编码。对,我就是这么无聊,凌晨一点半在检查别人页面的编码。
再补一句:如果你遇到的是接口返回乱码,先看响应头,再看数据源,别一上来就改前端。
排查到后半段,我还顺手点开了 妻子被工人们带走的故事 的旧存档,那篇的评论区里居然也有人在问乱码,看来这事儿不是我一个人在半夜生气。还有个叫 ⭕⭕⭕插⭕⭕⭕视频 的链接,光看标题那圈圈叉叉,我还以为是乱码的另一种形态,结果点进去发现只是人家标题就这么写的,属于我误会了。最后还刷到 爆炒白丝包浆草麻豆,我承认,纯属手滑,但页面打开还挺快,编码也正常,就顺手记在这儿了。
好了,方法给完了,气也撒得差不多了。你要是照上面四步做完还是1234,那就不是编码的问题,是你该换个服务器了。