豫言 / 豫言操作系统文字规整 @ 0.2.0

去首尾空白、完整 Unicode 转小写、UTF-16 长度与“全为 Unicode 字母或数字”判断,语义同 ECMAScript 的字符串方法与 Unicode 字母、数字类。

源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。

规范.汉语.md

# 文字规整接口规范 0.2.0

本包补足标准库缺少的四个文字操作,语义与 ECMAScript 的对应字符串方法**逐字符相同**,使从 JS 迁来的业务在豫言里得到同样的结果:`去首尾空白` 等同 `String.prototype.trim`;`转小写` 等同不带区域的 `String.prototype.toLowerCase`;`UTF16长度` 等同字符串的 `length`;`全为字母或数字吗` 等同 `/^[\p{L}\p{N}]+$/u.test`。0.2.0 在 0.1.0 之上**只增函数,旧函数签名不变**。

`去首尾空白` 去掉首尾的 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(长度由 1 变 2 个字符);ẞ(U+1E9E)变成 ß。本已是小写或没有小写形式的字符不变。所用 Unicode 版本由宿主的 JavaScript 引擎决定,同一宿主版本下结果与 JS 一致。

`UTF16长度` 返回 UTF-16 码元数:基本平面字符计 1,增补平面字符(如 emoji 和部分汉字)计 2。它不同于标准库的 `串长度`(按通字符计数)和 `字节长度`(UTF-8 字节数)。迁移中依赖 JS `.length` 的校验(例如“邮箱不超过 254 长”)应使用本函数。

`全为字母或数字吗` 在字符串非空且每个码点都属 Unicode 通用类别的字母(L)或数字(N)时返回阳:汉字、假名、带音标的拉丁字母、希腊与西里尔字母、各种文字的十进制及其他数字(如全角数字、罗马数字 Ⅷ)都算;下划线、连字符、空白、标点、符号、emoji、组合记号(如单独的 U+0301)都不算;空串为阴。所用 Unicode 版本由宿主的 JavaScript 引擎决定。要接受额外字符(如下划线与连字符)的调用者,先在自己这一侧去掉这些字符,再对剩余部分调用本函数(剩余为空视为通过)。

四个函数的输入都不超过 1 MiB(UTF-8 字节,即 1048576);超出则调用失败并抛出豫言异常,不截断。四个函数不修改传入的字符串,也不做规范化(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`、`豫言` | 3、2 |
| `UTF16长度` | `😀`(U+1F600) | 2 |
| `全为字母或数字吗` | `abc123`、`豫言`、`é`、`Ⅷ`、`12` | 阳 |
| `全为字母或数字吗` | 空串、`a_b`、`a-b`、`a b`、`😀`、U+0301 | 阴 |
| 任一函数 | 1 MiB 加 1 字节 | 抛出豫言异常 |

## 边界

本包只提供这四个操作,不含 `toUpperCase`、区域相关的大小写、Unicode 规范化、按 UTF-16 下标取子串等;需要时另立函数。云工适配经通用句柄桥调用宿主 JS 引擎的 String 对象,其他宿主可用等价的原生实现,只要结果与 ECMAScript 的对应方法一致。

规范.文言.md

# 文字规整公约 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 对应之法同。