判断一个字符是不是空白,能有多难
来源:serce.me — 2026-10-30
📋 概述
作者在 Guava 里看到一段远比 c == ' ' 复杂的空白判断代码,顺着挖下去发现三层复杂度:Unicode 定义 25 个空白字符,但 Java、Python、JavaScript 三家各有一套——Java 排除不换行空格,Python 认 29 个(多出文件分隔符这类控制字符),JavaScript 反过来认 U+FEFF 却不认 U+0085;Unicode 自己还在改(U+180E 曾被移出空白集);最后为了让判断够快,Guava 用了一个完美哈希:乘 1682554634 再右移 27 位取索引,查一张 32 字符的表。
🔑 核心要点
「空白」连定义都不统一,所以函数签名里的 whitespace 到底指哪一套,得看文档而不是看名字。
名字也会骗人:零宽空格 U+200B 根本不是空白,而欧甘空格标记 U+1680 在带主线的字体里会画出一条可见横线。
Guava 的实现演进有据可查:先朴素匹配,再改成除 79 取模,最后换成完美哈希以避开除法。
作者顺手给了穷举脚本,任何人都能找出所有可用的乘数,把「魔法数字」还原成可验证的结论。
💡 金句
I do feel that these write-ups are becoming increasingly rare in the AI-first world, where there's rarely a reason to peek under the hood of a function as simple as isWhitespace.
👍 0
❤️ 点赞
👎 0
沉底
← 返回 Hacker News 首页