unicode rust

unicode - ¿Cómo puedo plegar una cuerda en Rust?



(2)

Estoy escribiendo una biblioteca de búsqueda de texto completo simple, y necesito plegar mayúsculas y minúsculas para verificar si dos palabras son iguales. Para este caso de uso, los .to_lowercase() existentes .to_lowercase() y .to_uppercase() no son suficientes .

A partir de una búsqueda rápida de crates.io, puedo encontrar bibliotecas para la normalización y la división de palabras, pero no el plegado de mayúsculas y minúsculas. regex-syntax tiene un código de plegado de mayúsculas y minúsculas , pero no está expuesto en su API.

Si no hay ninguna solución existente, entonces podría tener que rodar la mía 😃


La caja unicase no expone directamente el plegado de cajas, pero proporciona un tipo de envoltura genérica que implementa Eq , Ord y Hash de una manera que no distingue entre mayúsculas y minúsculas. La rama principal (no lanzada) es compatible tanto con el plegado de cajas ASCII (como una optimización) como con el plegado de cajas Unicode (aunque solo se admite plegado de cajas invariable).


Para mi caso de uso, he encontrado que la caja sin caja es la más útil.

Hasta donde yo sé, esta es la única biblioteca que admite la normalización. Esto es importante cuando quiere, por ejemplo, "㎒" (U + 3392 SQUARE MHZ) y "mhz" para que coincida. Consulte el Capítulo 3 - Coincidencia Caseless predeterminada en el estándar Unicode para obtener detalles sobre cómo funciona esto.

Aquí hay un código de ejemplo que coincide con una cadena de forma insensible:

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));

Para obtener la cadena doblada de la caja directamente, puede usar la función default_case_fold_str :

let s = "Twilight Sparkle ちゃん"; assert_eq!(caseless::default_case_fold_str(s), "twilight sparkle ちゃん");

Caseless no expone una función correspondiente que también se normaliza, pero puede escribir una usando la caja de normalización Unicode :

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");

Tenga en cuenta que se necesitan múltiples rondas de normalización y plegado de casos para obtener un resultado correcto.

(Gracias a BurntSushi5 por señalarme esta biblioteca).