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 模式


用于 runestr-pancjkv

MIT/Apache

130KB
3K SLoC

rune, RuneStrRuneString

用户感知字符类型 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 也不是 SendSync

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