检查空格为何如此复杂?
How hard is it to check for whitespace?

最近在查看 Guava 库源码时,我发现一个简单的空格检查方法竟异常复杂。深入探究后发现,问题源于 Unicode 对空白字符的定义多达 25 种,且不同运行时标准不一:Java 排除了 NO-BREAK SPACE,Python 却将其纳入,而 JavaScript 又另辟蹊径。更棘手的是,Unicode 标准本身也在不断演变,导致旧定义失效。为兼顾性能与准确性,Guava 采用了一种巧妙的完美哈希函数实现,用 32 位整数运算替代线性遍历。这场关于空格的“技术考古”,揭示了看似简单的函数背后,隐藏着语言规范、性能优化与历史兼容的复杂博弈。
在 AI 主导的世界里,像 isWhitespace 这样简单的函数,人们已很少愿意去探究其背后的实现细节。
HN 评论区
17- smallstepforman
如果用位掩码,只要假设第 5 位(随便哪一位)代表零即空白,每天每台设备就能省下数十亿次 CPU 周期。在 32 位 Unicode 下,这能给你 32 个独特的空白字符。
当初真该找那些在 8 位微型计算机时代长大的人来写这个规范。
- pixelbeat__
我觉得水平空白应该区分开来,因为大家在处理分割等操作时最关心的就是这个。
看看 GNU coreutils 是如何以跨平台一致的方式对每种空白类型进行分类的:https://github.com/coreutils/coreutils/blob/master/src%2Fsys...
- efilife
这段代码很简单,但我还是不太明白。为什么需要哈希?它怎么就比正则表达式快呢?有没有比我聪明的人来解释一下?