#unicode #character-property #rtl #bidi #unicode-text #text

unic-ucd-bidi

UNIC — Unicode 字符数据库 — Bidi 属性

9 个版本 (破坏性更新)

0.9.0 2019年3月3日
0.8.0 2019年1月2日
0.7.0 2018年2月7日
0.6.0 2017年9月22日
0.1.1 2017年6月20日

#57 in 国际化 (i18n)

Download history 2176/week @ 2024-03-14 3075/week @ 2024-03-21 3154/week @ 2024-03-28 3339/week @ 2024-04-04 3870/week @ 2024-04-11 3785/week @ 2024-04-18 3402/week @ 2024-04-25 3904/week @ 2024-05-02 4234/week @ 2024-05-09 3703/week @ 2024-05-16 3940/week @ 2024-05-23 4567/week @ 2024-05-30 2748/week @ 2024-06-06 3733/week @ 2024-06-13 4429/week @ 2024-06-20 3447/week @ 2024-06-27

每月14,998次下载
用于 102 个库 (6 个直接使用)

MIT/Apache

81KB
1K SLoC

UNIC:Rust 的 Unicode 和国际化组件

UNIC-logo

Travis Rust-1.45+ Unicode-10.0.0 Release Crates.io Documentation Gitter

https://github.com/open-i18n/rust-unic

UNIC 是一个开发 Rust 编程语言组件的项目,以提供高质量且易于使用的 Unicode 和国际化数据及算法库。换句话说,它就像是 Rust 的 ICU,完全用 Rust 编写,大多数情况下使用 safe 模式,但在可能的情况下也受益于 unsafe 模式的性能提升。

请参阅 UNIC 变更日志 以获取最新发布详情。

项目目标

UNIC 的目标是提供对 Unicode 和国际化功能所有级别的访问,从 Unicode 字符属性开始,到处理文本的 Unicode 算法,以及基于 Unicode Common Locale Data Repository (CLDR) 的更高级(基于区域)过程。

根据需要,还实现了其他标准和最佳实践,如 IETF RFC。

项目状态

目前 UNIC 正在积极开发中:API 在 master 分支上频繁更新,每个 0.x 发布之间可能会出现 API 破坏。请参阅 公开问题 了解计划中的更改。

我们预计将在 2018 年发布 1.0 版本,之后将保持 API 稳定,在最初的几年里,可能每年更新一到两次 API。

设计目标

  1. UNIC的主要目标是通过易于使用的API提供可靠的功能。因此,新添加的组件可能没有针对性能进行很好的优化,但将具备足够的测试以展示其对标准的符合性,并提供示例来展示用户如何使用它们来解决常见需求。

  2. UNIC组件的下一个主要目标是性能和低二进制和内存占用。特别是,优化ASCII和其他常见情况下的运行时将鼓励适应,而无需担心放缓常规的开发过程。

  3. 组件将在可能范围内保证提供一致的数据和算法。跨组件测试用于捕捉实现之间的任何不一致性,而不会放缓开发过程。

组件及其组织

UNIC 组件 采用分层组织结构,从unic根目录开始,包含主要组件。每个主要组件反过来可能包含一些次要组件

主要组件的API是为库的最终用户设计的,并预期会进行广泛的文档编写,并附带代码示例。

与主要组件相反,次要组件作为数据算法的提供者,用于更高层次,其API预期将具有更高的性能,并提供多种访问数据的方式。

UNIC超级组件

unic超级组件是一个包含所有UNIC(主要)组件的集合,提供了一种访问所有功能的方法,当需要所有或大多数组件时,无需逐个导入组件。这个组件确保所有导入的组件在算法和数据上都是兼容的。

主要的代码示例和跨组件集成测试是在这个组件下实现的。

主要组件

应用

代码组织:合并仓库

使用合并仓库包含以下组件的原因之一是

  • 更快地开发。实现新的 Unicode/i18n 组件通常需要依赖其他(低级别)组件,而这些组件可能需要调整——如暴露新的 API、修复错误等——这些可以在更少的周期和更短的时间内进行开发、测试和审查。

  • 实现完整性。对其他组件的多个依赖意味着组件需要在某种程度上相互协调。许多 Unicode 算法是由较小的算法组成的,假设算法的所有部分都使用相同的 Unicode 数据版本。违反这一假设可能导致不一致性和难以捕捉的错误。在合并仓库中,可以在开发期间以及跨组件(集成)测试中达到更好的完整性。

  • 按需付费。小型组件(基本包),仅交叉依赖它们所需的内容,允许用户只将他们在项目中使用的内容引入。

  • 共享引导。大量扩展 Unicode/i18n 功能取决于将源 Unicode/区域数据转换为目标编程语言的格式化格式。在合并仓库中,更容易维护这些引导工具,扩展覆盖范围,并使用更高效的数据结构。

文档

如何使用 UNIC

Cargo.toml

[dependencies]
unic = "0.9.0"  # This has Unicode 10.0.0 data and algorithms

和在 main.rs

extern crate unic;

use unic::ucd::common::is_alphanumeric;
use unic::bidi::BidiInfo;
use unic::normal::StrNormalForm;
use unic::segment::{GraphemeIndices, Graphemes, WordBoundIndices, WordBounds, Words};
use unic::ucd::normal::compose;
use unic::ucd::{is_cased, Age, BidiClass, CharAge, CharBidiClass, StrBidiClass, UnicodeVersion};

fn main() {

    // Age

    assert_eq!(Age::of('A').unwrap().actual(), UnicodeVersion { major: 1, minor: 1, micro: 0 });
    assert_eq!(Age::of('\u{A0000}'), None);
    assert_eq!(
        Age::of('\u{10FFFF}').unwrap().actual(),
        UnicodeVersion { major: 2, minor: 0, micro: 0 }
    );

    if let Some(age) = '🦊'.age() {
        assert_eq!(age.actual().major, 9);
        assert_eq!(age.actual().minor, 0);
        assert_eq!(age.actual().micro, 0);
    }

    // Bidi

    let text = concat![
        "א",
        "ב",
        "ג",
        "a",
        "b",
        "c",
    ];

    assert!(!text.has_bidi_explicit());
    assert!(text.has_rtl());
    assert!(text.has_ltr());

    assert_eq!(text.chars().nth(0).unwrap().bidi_class(), BidiClass::RightToLeft);
    assert!(!text.chars().nth(0).unwrap().is_ltr());
    assert!(text.chars().nth(0).unwrap().is_rtl());

    assert_eq!(text.chars().nth(3).unwrap().bidi_class(), BidiClass::LeftToRight);
    assert!(text.chars().nth(3).unwrap().is_ltr());
    assert!(!text.chars().nth(3).unwrap().is_rtl());

    let bidi_info = BidiInfo::new(text, None);
    assert_eq!(bidi_info.paragraphs.len(), 1);

    let para = &bidi_info.paragraphs[0];
    assert_eq!(para.level.number(), 1);
    assert_eq!(para.level.is_rtl(), true);

    let line = para.range.clone();
    let display = bidi_info.reorder_line(para, line);
    assert_eq!(
        display,
        concat![
            "a",
            "b",
            "c",
            "ג",
            "ב",
            "א",
        ]
    );

    // Case

    assert_eq!(is_cased('A'), true);
    assert_eq!(is_cased('א'), false);

    // Normalization

    assert_eq!(compose('A', '\u{030A}'), Some('Å'));

    let s = "ÅΩ";
    let c = s.nfc().collect::<String>();
    assert_eq!(c, "ÅΩ");

    // Segmentation

    assert_eq!(
        Graphemes::new("a\u{310}e\u{301}o\u{308}\u{332}").collect::<Vec<&str>>(),
        &["a\u{310}", "e\u{301}", "o\u{308}\u{332}"]
    );

    assert_eq!(
        Graphemes::new("a\r\nb🇺🇳🇮🇨").collect::<Vec<&str>>(),
        &["a", "\r\n", "b", "🇺🇳", "🇮🇨"]
    );

    assert_eq!(
        GraphemeIndices::new("a̐éö̲\r\n").collect::<Vec<(usize, &str)>>(),
        &[(0, ""), (3, ""), (6, "ö̲"), (11, "\r\n")]
    );

    assert_eq!(
        Words::new(
            "The quick (\"brown\") fox can't jump 32.3 feet, right?",
            |s: &&str| s.chars().any(is_alphanumeric),
        ).collect::<Vec<&str>>(),
        &["The", "quick", "brown", "fox", "can't", "jump", "32.3", "feet", "right"]
    );

    assert_eq!(
        WordBounds::new("The quick (\"brown\")  fox").collect::<Vec<&str>>(),
        &["The", " ", "quick", " ", "(", "\"", "brown", "\"", ")", " ", " ", "fox"]
    );

    assert_eq!(
        WordBoundIndices::new("Brr, it's 29.3°F!").collect::<Vec<(usize, &str)>>(),
        &[
            (0, "Brr"),
            (3, ","),
            (4, " "),
            (5, "it's"),
            (9, " "),
            (10, "29.3"),
            (14, "°"),
            (16, "F"),
            (17, "!")
        ]
    );
}

您可以在 examplestests 目录下找到更多示例。(随着 UNIC 的扩展,还将添加更多内容...)

许可证

许可如下

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交的任何有意提交以包含在作品中的贡献,应按上述方式双重许可,不附加任何额外条款或条件。

行为准则

UNIC 项目遵循 Rust 行为准则。您可以在 CODE_OF_CONDUCT.md 或在线 https://rust-lang.net.cn/conduct.html 找到其副本。


lib.rs:

UNIC — UCD — Bidi

unic 的组件:为 Rust 提供的 Unicode 和国际化包。

从 Unicode 字符数据库(UCD)访问双向字符属性

依赖项