网易首页 > 网易号 > 正文 申请入驻

UTF-8 程序员该知的基本常识,否则“坑”你没商量

0
分享至

UTF-8人人用,乱码却频频出现,这5个坑你避开了吗?

老实说,UTF-8这东西天天见,但真搞明白的人不多。我以前也以为它就是个标准编码,结果写代码时总遇到奇奇怪怪的问题。今天就用大白话聊聊它的原理和常见的坑。



先说说UTF-8的原理,其实不难理解。它设计成变长的,就是为了兼容英文的ASCII码,同时又能表示全世界各种字符。比如英文字母用1个字节,中文字用3个字节,表情符号用4个字节。这样既省空间,又能统一。

怎么区分一个字符占几个字节呢?看第一个字节的开头几个位就行。0开头就是1字节,110开头就是2字节,1110开头是3字节,11110开头是4字节。后面的字节都以10开头。这个规则记不住也没事,重点是要知道字符不是等长的。



我踩过的第一个坑就是误把字节数当字符数。有次做文本输入框,限制用户输入100个字符,我直接用strlen()判断长度。结果中文用户输入几个字就提示超了,因为一个汉字占3个字节。正确的做法是遍历统计码点个数,或者用语言自带的字符数函数。



第二个坑是半字符截断。从网络流里按固定字节大小读取数据,经常把一个汉字切成两半,导致后面全是乱码。解决方法是读取时找字符边界,或者用专门的库函数安全截断。



第三个坑是正则表达式匹配失败。我写过一段代码用[a-z]匹配字母,结果带重音的é匹配不上。后来才知道正则默认是逐字节匹配,要启用Unicode模式,比如加个u标志,或者用\p{L}匹配所有字母。



第四个坑是BOM引发的幻觉。Windows的记事本默认会给UTF-8文件开头加三个字节(EF BB BF),Linux下用cat看文件第一行会莫名其妙出现。更坑的是脚本文件开头如果有BOM,shebang行就失效了。解决办法是在读写时明确指定编码,比如Python用utf-8-sig自动处理。



第五个坑是数据库编码不统一。有次把UTF-8数据存到MySQL的latin1列里,取出来全是问号。后来统一把表、连接、客户端都设成utf8mb4才解决。



说到BOM,很多人觉得它没用还添乱。BOM本身是Unicode用来标记字节顺序的,但在UTF-8里它唯一的作用就是告诉别人这文件是UTF-8编码。支持的人说它能消除歧义,特别在Windows环境很常见。反对的人说它破坏格式、浪费空间、Unix工具不兼容。我个人的看法是,看使用场景:团队内部文件可以不带BOM,跟Windows交换文档就带上,Web资源和服务端脚本一律无BOM。



为了避免这些问题,我养成了一些习惯。项目一初始化就用.editorconfig强制编码为UTF-8,编辑器设置成无BOM保存。Git里配好autocrlf,防止换行符捣乱。写代码时遇到字符串处理就写单元测试,专门测截断、长度和正则。用户上传的文件,我都先检测编码,不是UTF-8就转码。



数据库迁移脚本里明确声明字符集,Web服务器加Content-Type头。部署后用file -i命令检查文件实际编码,心里有个底。



说到底,UTF-8不是学一次就完事的知识,得在项目里反复验证。遇到乱码别用玄学解释,查编码、看字节,一步步排查。记住一条:永远别相信默认编码,明确指定比凭直觉靠谱多了。



特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
潘功胜最新回应“信贷失速”焦虑:金融支持实体不能只看贷款增速

潘功胜最新回应“信贷失速”焦虑:金融支持实体不能只看贷款增速

红星资本局
2026-09-17 12:26:12
美国国会通过对俄罗斯的“地狱制裁”法案,特朗普即将签署

美国国会通过对俄罗斯的“地狱制裁”法案,特朗普即将签署

山河路口
2026-09-17 18:58:54
19世纪非洲,暴君选妃从来不在乎长相,反倒像饲养生猪喂养,等到她们无法起身行动,一桩诡异秘事浮出水面

19世纪非洲,暴君选妃从来不在乎长相,反倒像饲养生猪喂养,等到她们无法起身行动,一桩诡异秘事浮出水面

唠叨说历史
2026-07-28 10:58:48
“一拳打到我父亲头部”,56岁保安遭业主推搡倒地,抢救21天后死亡

“一拳打到我父亲头部”,56岁保安遭业主推搡倒地,抢救21天后死亡

中国新闻周刊
2026-09-17 16:15:44
WTA总决赛2027年起落户夏洛特 三年合约覆盖2027-2029赛季

WTA总决赛2027年起落户夏洛特 三年合约覆盖2027-2029赛季

星河漫山野
2026-09-17 00:40:09
6999元!全新华为WATCH Ultimate 2非凡探索开售:首次联名迪桑特

6999元!全新华为WATCH Ultimate 2非凡探索开售:首次联名迪桑特

快科技
2026-09-17 09:50:05
家里催婚压力大,男子相亲当天就领证,彩礼16.8万元,三个月后女方离家,离婚只退13万元;婚介公司:是他承诺从没兑现、全靠忽悠

家里催婚压力大,男子相亲当天就领证,彩礼16.8万元,三个月后女方离家,离婚只退13万元;婚介公司:是他承诺从没兑现、全靠忽悠

深圳晚报
2026-09-15 20:57:12
虽说阿姨有30多岁了,但是这样打扮一下反而比年轻的女生更有魅力

虽说阿姨有30多岁了,但是这样打扮一下反而比年轻的女生更有魅力

美女穿搭分享
2026-09-06 09:40:17
这8种优质碳水,稳定血糖,有效减内脏脂肪,让你越吃越瘦!

这8种优质碳水,稳定血糖,有效减内脏脂肪,让你越吃越瘦!

运动健身号
2026-09-15 10:57:15
丹参滴丸不仅可以用于心脏病,还能治这4种病?建议收藏

丹参滴丸不仅可以用于心脏病,还能治这4种病?建议收藏

健康之光
2026-08-06 19:20:07
菲律宾电影有多敢拍?尺度炸裂,后劲上头,看完直接失眠

菲律宾电影有多敢拍?尺度炸裂,后劲上头,看完直接失眠

小椰的奶奶
2026-08-29 07:27:27
大伯从不在乎人情世故,我出嫁时他没随礼,却把我叫到了门口

大伯从不在乎人情世故,我出嫁时他没随礼,却把我叫到了门口

五元讲堂
2026-01-01 07:10:03
留美1年变壮了!中国男篮19岁2米06新星蜕变:效力NCAA名校,化身魔鬼筋肉人

留美1年变壮了!中国男篮19岁2米06新星蜕变:效力NCAA名校,化身魔鬼筋肉人

李喜林篮球绝杀
2026-09-17 11:59:23
史上最严厉对俄制裁法案即将生效!1700名乌军在哈尔科夫被围?

史上最严厉对俄制裁法案即将生效!1700名乌军在哈尔科夫被围?

鹰眼Defence
2026-09-17 11:01:13
9月17日俄乌:欧盟重申继续支持乌克兰,俄军单日损失近2000人

9月17日俄乌:欧盟重申继续支持乌克兰,俄军单日损失近2000人

山河路口
2026-09-17 23:03:33
上映多时票房只有零元,国际影帝新片惨败,被手搓电影打懵了

上映多时票房只有零元,国际影帝新片惨败,被手搓电影打懵了

影视高原说
2026-09-17 18:21:28
高速大整改真来了!不取消120限速,开车方式彻底变样

高速大整改真来了!不取消120限速,开车方式彻底变样

三农老历
2026-09-15 04:13:38
1270万毕业生里,没背景没人脉的孩子才真的难

1270万毕业生里,没背景没人脉的孩子才真的难

细说职场
2026-08-31 15:16:21
为什么舆论总被片面信息裹挟酿成悲剧

为什么舆论总被片面信息裹挟酿成悲剧

风铃草语
2026-09-17 08:35:26
台海该慌了!中国正研发目标130公里新炮弹,一旦成真谁最头疼?

台海该慌了!中国正研发目标130公里新炮弹,一旦成真谁最头疼?

掌秋看世界
2026-09-15 18:48:16
2026-09-18 02:56:49
侃故事的阿庆
侃故事的阿庆
几分钟看完一部影视剧,诙谐幽默的娓娓道来
865文章数 9528关注度
往期回顾 全部

科技要闻

影视飓风Tim反掰iPhoneDuo被质疑

头条要闻

永和豆浆视频被指擦边:女子穿蕾丝吊带 脱黑丝袜洗澡

头条要闻

永和豆浆视频被指擦边:女子穿蕾丝吊带 脱黑丝袜洗澡

体育要闻

逆转朝鲜,国足亚运队“啃老”过关

娱乐要闻

rapper赵涛恋情曝光!带甜馨妈妈散步

财经要闻

缺钱的追觅 隐藏的债务?

汽车要闻

小鹏G9L限时售23.18万 旗舰级的配置/诱人的价格

态度原创

本地
手机
旅游
公开课
军事航空

本地新闻

不止胖东来!许昌藏着半部三国史

手机要闻

鸿蒙7花粉Beta版有惊喜,华为Mate 60系列手机升级后新增支持眼动翻页功能

旅游要闻

让双节旅游市场活力更加充分释放

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

韩国外长表态:尚未决定是否向霍尔木兹海峡派兵

无障碍浏览 进入关怀版