Для моего варианта использования я нашел ящик caseless, чтобы быть наиболее полезным.
Насколько я знаю, это единственная библиотека, которая поддерживает нормализацию. Это важно, когда вы хотите, например, «㎒» (U + 3392 SQUARE MHZ) и «mhz» для соответствия. См. Chapter 3 - Default Caseless Matching в стандарте Unicode, чтобы узнать, как это работает.
Вот пример кода, который соответствует строке регистронезависимо:
extern crate caseless;
use caseless::Caseless;
let a = "100 ㎒";
let b = "100 mhz";
// These strings don't match with just case folding,
// but do match after compatibility (NFKD) normalization
assert!(!caseless::default_caseless_match_str(a, b));
assert!(caseless::compatibility_caseless_match_str(a, b));
Чтобы получить случай свернутую строку напрямую, вы можете использовать default_case_fold_str
функцию:
let s = "Twilight Sparkle ちゃん";
assert_eq!(caseless::default_case_fold_str(s), "twilight sparkle ちゃん");
безгильзовых не разоблачать соответствующая функция, которая также нормализуется, но вы можете записать ее с помощью ящика unicode-normalization:
extern crate unicode_normalization;
use caseless::Caseless;
use unicode_normalization::UnicodeNormalization;
fn compatibility_case_fold(s: &str) -> String {
s.nfd().default_case_fold().nfkd().default_case_fold().nfkd().collect()
}
let a = "100 ㎒";
assert_eq!(compatibility_case_fold(a), "100 mhz");
Обратите внимание, что для правильного результата необходимы несколько циклов нормализации и фальцовки.
(спасибо BurntSushi5 за то, что указали мне на эту библиотеку.)
Что конкретно не хватает в этих методах? Трудно ответить на ваш вопрос, не зная проблему, которую вы пытаетесь решить. Существуют также методы, определенные на char: https://doc.rust-lang.org/std/primitive.char.html#method.to_lowercase – BurntSushi5
@ BurntSushi5 Я добавил некоторый контекст к вопросу - надеюсь, что это поможет. –
Ваш лучший выбор, вероятно, https://docs.rs/caseless/0.1.1/caseless/ – BurntSushi5