#unicode #joining #arabic #shaping #no-std

no-std unicode-joining-type

快速查找 Unicode 连接类型和连接组属性

8 个版本 (破坏性)

0.7.0 2022 年 9 月 19 日
0.6.0 2022 年 1 月 25 日
0.5.0 2021 年 2 月 3 日
0.4.0 2020 年 11 月 18 日
0.1.0 2019 年 12 月 13 日

#629文本处理

Download history 521/week @ 2024-03-27 430/week @ 2024-04-03 555/week @ 2024-04-10 633/week @ 2024-04-17 518/week @ 2024-04-24 496/week @ 2024-05-01 454/week @ 2024-05-08 580/week @ 2024-05-15 399/week @ 2024-05-22 573/week @ 2024-05-29 434/week @ 2024-06-05 434/week @ 2024-06-12 508/week @ 2024-06-19 405/week @ 2024-06-26 417/week @ 2024-07-03 321/week @ 2024-07-10

1,704 每月下载次数
用于 10 个 crate (3 直接)

Apache-2.0

70KB
1.5K SLoC

unicode-joining-type


使用 Unicode 15.0 数据在 Rust 中快速查找 char 的 Unicode 连接类型和连接组属性。此 crate 兼容 no-std。

用法

use unicode_joining_type::{get_joining_type, JoiningType};
use unicode_joining_type::{get_joining_group, JoiningGroup};

fn main() {
    assert_eq!(get_joining_type('A'), JoiningType::NonJoining);
    assert_eq!(get_joining_group('ھ'), JoiningGroup::KnottedHeh);
}

性能 & 实现说明

ucd-generate 用于生成 joining_type_tables.rsjoining_group_tables.rs。构建脚本 (build.rs) 将这些编译成两个级别的查找表。查找时间是常数,因为它只是索引到两个数组。

两级方法将代码点映射到块,然后映射到块内的位置。这允许第二级块去重,节省空间。代码对块大小进行了参数化,块大小必须是 2 的幂。构建脚本中的值对于数据集是最佳的。

这种方法以一些空间为代价换取更快的查找。连接类型表占用约 26KiB,连接组表占用约 6.75KiB。基准测试表明,这种方法比典型的二分搜索方法快 5–10 倍。

还有进一步减小大小的空间。例如,通过消除第一级块数组的末尾重复的块映射。

无运行时依赖