11个稳定版本

1.4.0 2023年7月21日
1.3.1 2022年9月17日
1.1.2 2022年1月23日
1.1.0 2021年11月15日
1.0.0 2020年8月8日

#121 in 文本处理

Download history 178/week @ 2024-04-22 260/week @ 2024-04-29 156/week @ 2024-05-06 305/week @ 2024-05-13 166/week @ 2024-05-20 259/week @ 2024-05-27 150/week @ 2024-06-03 159/week @ 2024-06-10 156/week @ 2024-06-17 233/week @ 2024-06-24 244/week @ 2024-07-01 414/week @ 2024-07-08 148/week @ 2024-07-15 257/week @ 2024-07-22 296/week @ 2024-07-29 183/week @ 2024-08-05

904 每月下载量
用于 spongebobizer

MIT AND Unicode-DFS-2016

215KB
5K SLoC

focaccia

GitHub Actions Code Coverage Discord Twitter
Crate API API trunk

Unicode case folding方法用于不区分大小写的字符串比较。用于在Artichoke Ruby中实现Ruby Core实现中的SymbolString类的case folding操作。

Focaccia支持全、ASCII和土耳其语Unicode case folding等性和顺序比较。

软件开发者最常见的事情之一是“规范化”文本以进行比较。开发者被教导将文本规范化以进行比较的最基本方式之一是进行“不区分大小写”的比较。在其他情况下,开发者希望以区分大小写的方式比较字符串。Unicode定义了字符的大写、小写和标题属性,以及影响特定语言文本使用的特殊情况。(W3C,Case Folding)

focaccia是一种扁平面包。focaccia crate通过将其扁平化为折叠后的小写来比较UTF-8字符串。Artichoke和focaccia很搭。

使用方法

将其添加到您的Cargo.toml

[dependencies]
focaccia = "1.4.0"

然后进行不区分大小写的字符串比较,如下所示

use core::cmp::Ordering;
use focaccia::CaseFold;

let fold = CaseFold::Full;
assert_eq!(fold.casecmp("MASSE", "Maße"), Ordering::Equal);
assert_eq!(fold.casecmp("São Paulo", "Sao Paulo"), Ordering::Greater);

assert!(fold.case_eq("MASSE", "Maße"));
assert!(!fold.case_eq("São Paulo", "Sao Paulo"));

对于已知为ASCII的文本,Focaccia可以进行更高效的比较检查

use core::cmp::Ordering;
use focaccia::CaseFold;

let fold = CaseFold::Ascii;
assert_eq!(fold.casecmp("Crate: focaccia", "Crate: FOCACCIA"), Ordering::Equal);
assert_eq!(fold.casecmp("Fabled", "failed"), Ordering::Less);

assert!(fold.case_eq("Crate: focaccia", "Crate: FOCACCIA"));
assert!(!fold.case_eq("Fabled", "failed"));

ASCII比较可以检查在字节切片上

use core::cmp::Ordering;
use focaccia::{ascii_casecmp, ascii_case_eq};

assert_eq!(ascii_casecmp(b"Artichoke Ruby", b"artichoke ruby"), Ordering::Equal);
assert!(ascii_case_eq(b"Artichoke Ruby", b"artichoke ruby"));

土耳其语case folding类似于全case folding,并为带点和不带点的I添加了额外的映射

use core::cmp::Ordering;
use focaccia::CaseFold;

let fold = CaseFold::Turkic;
assert_eq!(fold.casecmp("İstanbul", "istanbul"), Ordering::Equal);
assert_ne!(fold.casecmp("İstanbul", "Istanbul"), Ordering::Equal);

assert!(fold.case_eq("İstanbul", "istanbul"));
assert!(!fold.case_eq("İstanbul", "Istanbul"));

实现

Focaccia从Unicode数据文件生成转换表。Focaccia按照Unicode标准(见CaseFolding.txt)实现case folding。

no_std

FOCACCI与std的依赖性可选并默认启用,兼容no_std。在no_std配置下,FOCACCI不链接到alloc

库特性

所有特性默认启用。

  • std - 启用链接到Rust标准库。启用此特性将向此crate的错误类型添加Error实现。

最低支持的Rust版本

此crate至少需要Rust 1.56.0版本。此版本可以在小版本发布中升级。

Unicode版本

FOCACCI实现了Unicode大小写折叠,遵循Unicode 15.0.0大小写折叠规则集。

Unicode的每个新版本都可能更新此crate中折叠映射的源CaseFolding.txt,这将是此crate中折叠映射的来源。大小写折叠规则的更新将伴随着小版本号的提升。

许可证

focacciaMIT许可证下授权(c)Ryan Lopopolo。

focaccia包括受Unicode使用条款Unicode数据文件和软件许可证约束的Unicode数据文件(c)1991-2022 Unicode, Inc.

此存储库中的生成文件带有// @generated注释和Unicode版权声明。这些生成文件结合了从Unicode数据文件中提取的数据。有关生成过程的更多详细信息,请参阅scripts/gen_case_lookups.rb。此脚本创建的生成源同时受此存储库中包含的MIT许可证和Unicode数据文件和软件许可证的约束。

无运行时依赖