11 个版本
0.1.10 | 2022年5月23日 |
---|---|
0.1.9 | 2022年5月23日 |
0.1.6 | 2021年9月19日 |
0.1.5 | 2021年8月15日 |
#777 in Rust 模式
130KB
3K SLoC
rune
, RuneStr
和 RuneString
用户感知字符类型 rune
及其相关类型和数据结构。
示例
use runestr::{rune, RuneString};
fn main() {
let runestr = RuneString::from_str_lossy("\u{0041}\u{0341}\u{304B}\u{3099}\u{9508}");
assert_eq!(3, runestr.runes().count());
}
许可
许可协议为 Apache 许可证 2.0 版或 MIT 许可证,由您选择。除非您明确声明,否则您提交给本软件包的任何有意贡献,根据 Apache-2.0 许可证的定义,应双重许可如上所述,不附加任何额外条款或条件。
lib.rs
:
用户感知字符相关类型和数据结构。
rune
类型表示一个用户感知字符。它大致对应于 Unicode 图形集群,但有一些很好的属性。由两个或更多 char
组成的 Runes 将在每个线程的基础上自动注册。这也意味着 rune
也不是 Send
或 Sync
。
RuneStr
类型,也称为“rune 字符串切片”,是一个基于 rune 的原始字符串类型。它通常以借用形式出现,即 &RuneStr
。
Rune 字符串切片使用一种特殊的编码 FSS-UTF
编码,这是 UTF-8 编码的超集。这使得所有 rune
都可以被编码。
RuneString
类型,是一种可增长的基于 rune 的字符串类型。
Rune 定义
我们的 rune 定义基于 UAX-29 中定义的扩展图形集群。在此基础上,我们将所有 CJK 兼容表意文字转换为它们的等效 IVS 形式,然后将文本转换为 NFC 形式。在必要时,我们还会应用一些特定的“有损转换”规则。规则定义如下,其目标是使每个 rune“独立”,也就是说,当两个 rune 放在一起时,它们不会自动合并成一个更大的 rune。
Rune 内部有损转换规则
- 一个孤立的抽象字符 CR(U+000D)被转换为 CR LF 序列。
- 如果一个韩文字节单元不包含 CHOSEONG 或 JUNGSEONG 字符,将自动添加相应的过滤器(U+115F,U+1160)。
- 一个孤立的区域指示符(U+1F1E6..U+1F1FF)抽象字符会自动附加另一个副本,使其不再孤立。
- 以抽象字符 ZWJ(U+200D)结尾的扩展象形序列,其前面有一个可选的连续字符序列,将获得另一个额外的 ZWJ(U+200D)抽象字符,以防止它与下一个字符合并形成更大的扩展象形序列。
- 如果没有提供基字符,将插入一个空格字符(U+0020)。
依赖项
~1.5MB
~49K SLoC