文字规整公约 0.2.0
此包补标准库所无之四术,其义与 ECMAScript 对应之字符串法逐字相同,使自 JS 迁来之业于豫言得同一之果:去首尾空白 同 String.prototype.trim;转小写 同不带区域之 String.prototype.toLowerCase;UTF16长度 同字符串之 length;全为字母或数字吗 同 /^[\p{L}\p{N}]+$/u.test。二版于初版之上惟增其术,旧术之签不易。
去首尾空白 去首尾之 WhiteSpace 与 LineTerminator:U+0009、U+000A、U+000B、U+000C、U+000D、U+0020、U+00A0、U+1680、U+2000 至 U+200A、U+2028、U+2029、U+202F、U+205F、U+3000、U+FEFF(字节序标记)。U+0085、U+180E、U+200B 非空白,不去。中间之空白不动,果可为空文。
转小写 依 Unicode 完整(含特殊)之大小写映射转小写,不带区域,并含词尾 Σ 之上下文规则(Final_Sigma):ΑΣ 为 ας,词中之 Σ 为 σ;带点之大写 İ(U+0130)为 i 加 U+0307(其长自一字变二字);ẞ(U+1E9E)为 ß。本已小写或无小写之形者不变。所用 Unicode 之版,由宿主 JavaScript 引擎定之,同一宿主版本,其果与 JS 同。
UTF16长度 返 UTF-16 码元之数:基本平面之字计一,增补平面之字(如 emoji 及部分汉字)计二。此异于标准库之 串长度(按通字符计)与 字节长度(UTF-8 字节之数)。迁移中倚 JS .length 之验(如“邮箱不逾二百五十四长”)者,当用此术。
全为字母或数字吗 者,文非空,且每一码点皆属 Unicode 通类之字母(L)或数字(N),则阳:汉字、假名、带音之拉丁字母、希腊与西里尔字母、诸文之十进及他数(如全角数字、罗马数字 Ⅷ)皆算;下划线、连字符、空白、标点、符号、emoji、组合之记(如独立之 U+0301)皆不算;空文为阴。所用 Unicode 之版,由宿主 JavaScript 引擎定之。欲容他字(如下划线与连字符)者,先于己侧去之,再以余部调此术(余空则视为过)。
四术之入皆不逾一 MiB(UTF-8 字节,即一零四八五七六);逾则调用败而抛豫言之异,不截。四术不改所传之文,亦不为规范化(NFC、NFD)、折叠(toLocaleLowerCase、大小写折叠)之属;孤立代理项不存于豫言字符串,故不在此约之域;入文若含非法之 UTF-8 序列,先依 WHATWG 之 UTF-8 解码之则,易每一非法序列为 U+FFFD,而后运算。
一致之例
| 术 | 入 | 果 |
| --- | --- | --- |
| 去首尾空白 | U+3000、空格、a b、U+3000 | a b |
| 去首尾空白 | U+FEFF、x、U+FEFF | x |
| 去首尾空白 | U+200B、x | 不变(U+200B 非空白) |
| 去首尾空白 | 全为空白之文 | 空文 |
| 转小写 | ABC ÜÏ | abc üï |
| 转小写 | İ | U+0069 U+0307 |
| 转小写 | ΑΣ、ΑΣΑ、Σ | ας、ασα、σ |
| UTF16长度 | abc、豫言 | 三、二 |
| UTF16长度 | 😀(U+1F600) | 二 |
| 全为字母或数字吗 | abc123、豫言、é、Ⅷ、12 | 阳 |
| 全为字母或数字吗 | 空文、a_b、a-b、a b、😀、U+0301 | 阴 |
| 任一术 | 一 MiB 又一字节 | 抛豫言之异 |
界
此包惟此四术,不含 toUpperCase、随区域之大小写、Unicode 规范化、按 UTF-16 下标取子串之属;有需则另立术。云工适配经通用句柄桥呼宿主 JS 引擎之 String 对象,他宿主可以等价之原生实现承之,惟其果须与 ECMAScript 对应之法同。