#unicode-characters #unicode #name #mapping #memory-mapping #run-time #lookup-tables

无 std unicode_names2

将字符映射到 Unicode 标准中给出的名称,并在时间上和空间上尽可能地高效。完整的双向表仅有约 500 KB,但仍提供双向 O(1)* 查找(*更准确地说,O(名称长度))。

12 个版本 (5 个稳定)

1.2.2 2024 年 3 月 10 日
1.2.1 2023 年 12 月 14 日
1.2.0 2023 年 10 月 14 日
0.6.0 2022 年 10 月 13 日
0.2.2 2018 年 6 月 17 日

#51文本处理

Download history 8076/week @ 2024-04-16 8373/week @ 2024-04-23 5903/week @ 2024-04-30 6338/week @ 2024-05-07 6298/week @ 2024-05-14 14363/week @ 2024-05-21 16708/week @ 2024-05-28 16637/week @ 2024-06-04 17285/week @ 2024-06-11 12118/week @ 2024-06-18 20741/week @ 2024-06-25 12498/week @ 2024-07-02 14727/week @ 2024-07-09 10438/week @ 2024-07-16 13585/week @ 2024-07-23 16385/week @ 2024-07-30

58,055 每月下载量
用于 73 个 Crates (17 个直接使用)

(MIT OR Apache-2.0) AND Unicode-DFS-2016

305KB
1K SLoC

Rust 819 SLoC // 0.1% comments Python 192 SLoC // 0.0% comments

unicode_names2

Build Status

高效地在运行时和编译时将字符映射到其 Unicode 15.1 名称。

fn main() {
    println!("☃ is called {}", unicode_names2::name('')); // SNOWMAN
    println!("{} is happy", unicode_names2::character("white smiling face")); //
    // (NB. case insensitivity)
}

使用与 Python 的 unicodedata 模块类似的技巧进行压缩,但这里的大小约为 70KB(12%)更小。

文档


lib.rs:

在字符和它们的规范名称之间进行转换。

此 crate 提供了两个函数,用于从 char 映射到 Unicode 标准中给出的名称(15.1)。没有运行时要求,因此只能与 core 一起使用(这需要指定 no_std cargo 功能)。表被高度压缩,但仍然很大(500KB),并提供双向高效的 O(1) 查找(更准确地说,O(名称长度))。

    println!("☃ is called {:?}", unicode_names2::name('')); // SNOWMAN
    println!("{:?} is happy", unicode_names2::character("white smiling face")); //
    // (NB. case insensitivity)

源代码.

相关的 unicode_names2_macros crate 提供了两个宏,用于编译时转换,提供类似于 Python 的 "\N{...}" 的命名字面量。

  • named_char!(name) 接受一个字符串 name 并创建一个 char 字面量。
  • named!(string) 函数接受一个字符串,并将任何 \\N{name} 序列替换为具有该名称的字符。注意。字符串转义序列不能自定义,因此需要额外的反斜杠(或原始字符串),除非您使用原始字符串。
#![feature(proc_macro_hygiene)]

#[macro_use]
extern crate unicode_names2_macros;

fn main() {
    let x: char = named_char!("snowman");
    assert_eq!(x, '');

    let y: &str = named!("foo bar \\N{BLACK STAR} baz qux");
    assert_eq!(y, "foo bar ★ baz qux");

    let y: &str = named!(r"foo bar \N{BLACK STAR} baz qux");
    assert_eq!(y, "foo bar ★ baz qux");
}

支持Cargo

此软件包位于crates.io,因此请将以下之一(或两者都)添加到您的 Cargo.toml 文件中。

[dependencies]
unicode_names2 = "0.2.1"
unicode_names2_macros = "0.2"

依赖项