1use unicode_normalization::UnicodeNormalization;
4
5pub fn canonical_unicode_nfc(value: &str) -> String {
7 value.nfc().collect()
8}
9
10pub fn canonical_unicode_lowercase_nfc(value: &str) -> String {
16 canonical_unicode_nfc(value)
17 .chars()
18 .flat_map(char::to_lowercase)
19 .collect::<String>()
20 .nfc()
21 .collect()
22}
23
24#[cfg(test)]
25mod tests {
26 use super::*;
27
28 #[test]
29 fn canonicalizes_composed_case_equivalents() {
30 assert_eq!(canonical_unicode_nfc("CAF\u{45}\u{301}"), "CAFÉ");
31 assert_eq!(canonical_unicode_lowercase_nfc("CAF\u{45}\u{301}"), "café");
32 assert_eq!(canonical_unicode_lowercase_nfc("CAFÉ"), "café");
33 }
34
35 #[test]
36 fn normalizes_lowercase_expansion_output() {
37 assert_eq!(canonical_unicode_lowercase_nfc("İ"), "i\u{307}");
38 }
39}