#unic #unicode #character-property #unicode-text #text #name-aliases

unic-ucd-name_aliases

UNIC — Unicode 字符数据库 — 名称别名

1 个不稳定版本

0.9.0 2019年3月3日

#202国际化 (i18n)

Download history 240/week @ 2024-04-11 199/week @ 2024-04-18 224/week @ 2024-04-25 211/week @ 2024-05-02 215/week @ 2024-05-09 187/week @ 2024-05-16 232/week @ 2024-05-23 269/week @ 2024-05-30 145/week @ 2024-06-06 203/week @ 2024-06-13 209/week @ 2024-06-20 158/week @ 2024-06-27 123/week @ 2024-07-04 449/week @ 2024-07-11 196/week @ 2024-07-18 213/week @ 2024-07-25

988 每月下载量
22 个包中使用 (通过 unic-ucd)

MIT/Apache

36KB
418

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 和国际化数据及算法的 crate。换句话说,它类似于 ICU,但完全用 Rust 编写,大部分在 safe 模式下,但也可以在可能的情况下从 unsafe 模式的性能提升中受益。

请参阅 UNIC 更新日志 了解最新版本的详细信息。

项目目标

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

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

项目状态

目前 UNIC 正在积极开发中:API 在 master 分支上经常更新,每个 0.x 版本之间都可能发生 API 断裂。请参阅 open issues 了解计划变更。

我们预计将在 2018 年发布 1.0 版本,并在之后维护稳定的 API,可能每年更新一两个 API。

设计目标

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

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

  3. 组件将尽可能保证提供一致的数据和算法。通过跨组件测试来捕捉实现之间的任何不一致,而不会减慢开发进程。

组件及其组织

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

主要组件的API是为库的最终用户设计的,并期望有广泛的文档,并伴随代码示例。

与主要组件相反,次要组件作为为高级别提供数据和算法的服务提供者,其API预计将更高效,并可能提供多种访问数据的方式。

UNIC超级组件包

unic 超级组件包是所有UNIC(主要)组件的集合,提供了一种方便的方式访问所有功能,当需要所有或大多数功能时,而不是逐个导入组件。此组件包确保所有导入的组件在算法和数据一致性方面兼容。

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

主要组件

  • unic-char:Unicode字符工具。Crates.io

  • unic-ucd:Unicode字符数据库(《UAX#44》)。Crates.io

  • unic-bidi:Unicode双向算法(《UAX#9》)。Crates.io

  • unic-normal:Unicode规范化形式(《UAX#15》)。Crates.io

  • unic-segment:Unicode文本分段算法(《UAX#29》)。Crates.io

  • unic-idna:Unicode IDNA兼容性处理(《UTS#46》)。Crates.io

  • unic-emoji:Unicode表情符号(《UTS#51》)。Crates.io

应用

代码组织:合并仓库

拥有这些组件的合并仓库的某些原因包括

  • 更快的发展。实现新的Unicode/i18n组件通常取决于其他(低级别)组件,而这些组件反过来可能需要调整——暴露新API、修复错误等,这些都可在更少的循环和更短的时间内进行开发、测试和审查。

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

  • 按需付费。小型组件(基本crates)仅依赖它们需要的部分,使用户只需将其项目中的消耗引入。

  • 共享引导。大量扩展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://www.rust-lang.net.cn/conduct.html 中找到其副本。


lib.rs:

UNIC — UCD — 名称别名

unic: Rust 的 Unicode 和国际化 Crates 的一个组件。

从 Unicode 字符数据库 (UCD) 访问字符名称别名属性

依赖项

~30KB