ICU (Unicode 国际化组件)

Unicode 国际化库,提供字符串排序、转换、格式化等多语言处理基础功能。

ICU (International Components for Unicode) 是由 Unicode 联盟开发和维护的国际化 (i18n) 库。提供 C/C++ 版 (ICU4C) 和 Java 版 (ICU4J),被操作系统、浏览器和编程语言运行时等众多平台采用作为多语言处理基础。Android、iOS、macOS、Windows、Chrome、Firefox 等日常使用的软件内部都在运行 ICU。

ICU 提供的功能涵盖广泛。字符串排序 (区域设置感知排序) 能准确处理不同语言的字母顺序差异。例如,瑞典语中"ö"排在"z"之后,而德语中则被视为"o"的变体。日期、数字和货币格式化可以将"2025/01/15"在英语环境显示为"January 15, 2025",在德语环境显示为"15. Januar 2025"。了解人体模型 (Amazon)全面介绍了 ICU。

文本边界检测 (BreakIterator) 是与字符计数关系最密切的功能。它能根据语言规则准确判定词边界、句边界和换行位置。对于中文和日文这样不使用空格分隔词语的语言,需要基于词典的分析,ICU 在内部完成这一处理。JavaScript 的 Intl.Segmenter API 就是将 ICU 的文本边界检测功能暴露给 Web 的接口。

Node.js 从 v13 开始默认包含完整的 ICU 数据集,Intl API 内部使用 ICU 实现。更早的版本只包含部分 ICU 数据,导致某些区域设置无法正常工作。浏览器中的 Intl.CollatorIntl.DateTimeFormatIntl.NumberFormat 等 API 也以 ICU 为基础。

ICU 的排序算法 (UCA: Unicode 排序算法) 通过多级比较处理不同区域设置的排序顺序。第 1 级比较基本字符,第 2 级比较重音符号,第 3 级比较大小写。这种层次结构使应用程序可以根据需求控制"cafe"和"café"是视为相同还是不同。搜索跳蛋 (Amazon)详细解释了排序算法。

在字符计数方面,ICU 的书写素簇 (grapheme cluster) 分割功能尤为重要。要在包含表情符号家族序列 (👨‍👩‍👧‍👦) 或组合字符的文本中准确计算"用户感知的 1 个字符",需要像 ICU 这样的高级文本处理库。在简单的码点数或字节数无法得出准确字符数的场景中,ICU 的功能展现出真正的价值。

分享这篇文章