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

Python字符串藏了5个字节,程序员集体懵圈

0
分享至


你敲下len("café"),Python告诉你4。转手传给一个编码函数,出来的字节是5个。你盯着屏幕的时间,比愿意承认的长得多。

然后巴西用户的名字炸了数据库。Windows同事打开你导出的CSV,é变成了é。你靠猜修复——这儿加个.encode('utf-8'),那儿加个.decode('utf-8'),不崩了。

但要是有人问为什么,诚实答案大概是:"编码什么的吧。"这篇文章填上这个坑。

01 根本不存在"纯文本"

有个事实让所有人第一次碰到都栽跟头:根本不存在"纯文本"这种东西

你处理的每个字符串——Python里的、数据库里的、终端里的、HTTP响应里的——都是编码过的。没有中立格式。é这字母对应的比特序列,完全取决于你和对方约定用哪种编码。

字节不会自带编码说明书。编码是一份协议,双方谈崩了,你就得到乱码,或者更糟的偶发性诡异行为。

这就是全文核心。但历史解释了这团糟怎么来的,而且历史其实挺精彩。

02 128个字符统治世界

ASCII——美国信息交换标准代码——1963年发布。为电传打字机的英文文本设计,干这活儿它完美。

128个字符。7比特。A到Z,0到9,标点符号,33个控制码(比如"响铃""换行""退格")。每个字符塞得进单字节,还剩1比特。

对美国工程师跟美国计算机对话,ASCII够用了。而且大概有二十年,大多数软件都是美国工程师写的,跑在美国计算机上,彼此对话。闭环。完全够用。


然后世界其他地方也想要计算机。 funny how that works.

03 第8比特的野蛮生长

ASCII用7比特,那字节里第8比特空着。于是大家自然都用上了。用法各不相同。

ISO 8859-1(Latin-1)拿它加西欧语言的 accented 字符。Code page 437是IBM PC标准,带框线字符,撑起了所有DOS界面。Windows-1252是微软版Latin-1,略有不同。JIS X 0208覆盖日语。GB 2312覆盖简体中文——后来中国强制推行GB 18030,不同标准,覆盖完整Unicode范围。KOI8-R覆盖俄语。Big5用完全不同的思路处理繁体中文。

到1990年代,编码成百上千。没有编码信息,字节序列本身毫无意义。

这就是编码战争。你的俄罗斯朋友用KOI8-R发邮件,你Windows机器用Windows-1252打开,Привет变成Привет——如果运气好,你还能认出是乱码;运气不好,它看起来像个有效但荒谬的句子,你压根没意识到出错了。

04 Unicode不是编码

Unicode解决的是另一个问题:给每个字符一个唯一编号。

Unicode Consortium 1991年成立,目标简单:终结编码战争。不再让é在不同系统里是不同的字节。给每个字符分配一个"码点"(code point)——一个抽象的数字,比如U+00E9就是é

但Unicode本身不是编码。它是字符到数字的映射表。把数字变成字节,你需要编码方案。

UTF-8是最常见的。变长编码:a用1字节,é用2字节,中文用3字节,emoji用4字节。向后兼容ASCII,纯英文文本不膨胀。互联网95%以上的文本用UTF-8。

UTF-16用2或4字节。Java、C#、Windows内部用。UTF-32固定4字节,浪费空间但索引快。还有GB 18030这种怪胎,中国强制标准,必须能表示所有Unicode字符,但结构完全不同。


05 你的bug从哪来

回到开头那个len("café") == 4但编码后5字节的问题。Python 3的字符串是Unicode码点序列,不是字节。é是一个码点,所以长度4。编码成UTF-8,é变成两个字节0xC3 0xA9,总共5字节。

巴西用户的名字炸数据库?大概率是数据库字段设了VARCHAR(50),存的是字节长度,不是字符长度。一个葡萄牙语名字可能50字符,但UTF-8编码后超了50字节。

Windows同事看到é?你用了UTF-8编码,但Excel默认按Windows-1252打开。UTF-8的0xC3 0xA9被当成两个Latin-1字符:é

最阴险的bug是偶发性的。系统A用UTF-8,系统B用Latin-1,大部分字符在ASCII范围内重叠,测试全过。直到某个用户名字带ñü,链条某处崩掉。

06 现在怎么办

第一,永远明确编码。打开文件时用encoding='utf-8',别依赖系统默认。Python 3.15终于要把UTF-8设为默认,但那是三十多年后的补丁。

第二,数据库用UTF-8,但注意CHARVARCHAR的长度限制是字节还是字符。MySQL的utf8mb4才是完整UTF-8,旧的utf8编码阉割过,emoji会炸。

第三,HTTP头要完整Content-Type: text/html; charset=utf-8,缺了charset,浏览器猜,猜错就乱码。

第四,CSV是灾难。没有标准编码声明,Excel的行为因地区和版本而异。救急用UTF-8带BOM(字节顺序标记),虽然BOM在Unix世界是污染,但Excel认它。

第五,日志和错误信息里打印原始字节。看到b'\xc3\xa9'比看到乱码有用一百倍,你能直接查这是UTF-8的é

那个巴西用户的名字,你最后怎么修的?是扩了数据库字段,还是终于在全链路统一了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-04-10 15:33:56
我已力竭,我已沉默

我已力竭,我已沉默

求实处
2026-04-08 23:20:40
维修费近万元!新买的特斯拉遭老人用钥匙划伤 哨兵模式拍下全过程

维修费近万元!新买的特斯拉遭老人用钥匙划伤 哨兵模式拍下全过程

快科技
2026-04-08 10:11:05
你最接近生理极限的一次经历是什么?网友分享让人目瞪口呆!

你最接近生理极限的一次经历是什么?网友分享让人目瞪口呆!

夜深爱杂谈
2026-04-09 19:39:13
解·释|“传承弘扬西迁精神”,凸显怎样的鲜明底色

解·释|“传承弘扬西迁精神”,凸显怎样的鲜明底色

上观新闻
2026-04-10 09:28:23
美国上周首次申领失业救济人数为219,000人

美国上周首次申领失业救济人数为219,000人

每日经济新闻
2026-04-09 20:39:03
抵达广东!威姆斯正式上任,新岗位曝光,与易建联联手,杜锋期待

抵达广东!威姆斯正式上任,新岗位曝光,与易建联联手,杜锋期待

萌兰聊个球
2026-04-10 10:35:36
总台记者观察丨美伊停火谈判 黎巴嫩成各方博弈焦点

总台记者观察丨美伊停火谈判 黎巴嫩成各方博弈焦点

北青网-北京青年报
2026-04-10 09:24:06
巴萨向欧足联申诉:裁判违反规则,巴萨已多年受害

巴萨向欧足联申诉:裁判违反规则,巴萨已多年受害

体坛周报
2026-04-10 09:40:44
蒋介石孙子召开发布会,提出“两蒋”移灵大陆,2句话让世人唏嘘

蒋介石孙子召开发布会,提出“两蒋”移灵大陆,2句话让世人唏嘘

老谢谈史
2026-03-18 18:33:35
“Token第一股”上市百日盘中市值破千亿,年内涨超470%

“Token第一股”上市百日盘中市值破千亿,年内涨超470%

21世纪经济报道
2026-04-10 15:42:09
追觅俞浩工作群发飙:把宇树所有客户抢过来,2亿招首席科学家

追觅俞浩工作群发飙:把宇树所有客户抢过来,2亿招首席科学家

三言科技
2026-04-10 14:05:08
世乒赛名单引热议!国乒选择梁靖崑放弃温瑞博,媒体人:教练组太糊涂,怪不得男单日渐式微

世乒赛名单引热议!国乒选择梁靖崑放弃温瑞博,媒体人:教练组太糊涂,怪不得男单日渐式微

体坛最前线66
2026-04-09 16:16:06
25岁,萝莉系爱豆,好身材让人挪不开眼

25岁,萝莉系爱豆,好身材让人挪不开眼

技巧君侃球
2026-04-10 18:17:48
老人要买200克黄金,店员报警了!

老人要买200克黄金,店员报警了!

环球网资讯
2026-04-10 17:07:15
北约30国访日团齐聚东京,高市早苗叫板:中国欠日本两笔账?

北约30国访日团齐聚东京,高市早苗叫板:中国欠日本两笔账?

饱饱科普
2026-04-10 17:50:24
爸爸梦到已故儿子说脚被刺扎了,立马驱车来到孩子墓前,眼前的一幕让人惊呆了!

爸爸梦到已故儿子说脚被刺扎了,立马驱车来到孩子墓前,眼前的一幕让人惊呆了!

张晓磊
2026-04-10 11:24:23
利物浦官宣32岁传奇自由身离队!效力9年夺9冠,3大豪门或成下家

利物浦官宣32岁传奇自由身离队!效力9年夺9冠,3大豪门或成下家

我爱英超
2026-04-10 06:35:51
巴基斯坦战机直飞伊朗,警告以色列敢动就击落!

巴基斯坦战机直飞伊朗,警告以色列敢动就击落!

林林爱天堂
2026-04-10 17:21:21
别查了,受不了!巴拿马外长终于急了:请中国尊重我!

别查了,受不了!巴拿马外长终于急了:请中国尊重我!

近史博览
2026-04-10 10:53:36
2026-04-10 18:44:49
灰度测试中
灰度测试中
生活正在重构,目前还在灰度测试阶段,暂不全量发布。
1081文章数 14关注度
往期回顾 全部

科技要闻

马斯克狂发大火箭也养不起AI 年亏50亿美元

头条要闻

王毅访问朝鲜会否同金正恩会面 外交部回应

头条要闻

王毅访问朝鲜会否同金正恩会面 外交部回应

体育要闻

17岁赚了一百万美元,25岁被CBA裁员

娱乐要闻

黄景瑜王玉雯否认恋情!聚会细节被扒

财经要闻

创业板改革制度落地 增设第4套上市标准

汽车要闻

搭载第二代刀片电池及闪充技术 腾势N8L闪充版预售35万起

态度原创

手机
游戏
艺术
家居
公开课

手机要闻

消息称三星上调4月Galaxy S26系列手机产量至300万台

10个月逼近PS5总销量三分之二!Switch2日本表现惊人

艺术要闻

于小冬2026年4月油画新作《花季》

家居要闻

复古风格 自然简约

公开课

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

无障碍浏览 进入关怀版