#unicode-text #text #text-normalization #recomposition

no-std unicode-normalization

This crate provides functions for normalization of Unicode strings, including Canonical and Compatible Decomposition and Recomposition, as described in Unicode Standard Annex #15

29 releases

0.1.25 Oct 30, 2025
0.1.24 Sep 17, 2024
0.1.23 Feb 20, 2024
0.1.22 Sep 16, 2022
0.1.1 Jul 9, 2015

#13 in Text processing

Download history 2238668/week @ 2025-07-28 2179322/week @ 2025-08-04 2163954/week @ 2025-08-11 2162879/week @ 2025-08-18 2300394/week @ 2025-08-25 2385188/week @ 2025-09-01 2353733/week @ 2025-09-08 2279631/week @ 2025-09-15 2309053/week @ 2025-09-22 2317487/week @ 2025-09-29 2342671/week @ 2025-10-06 2270778/week @ 2025-10-13 2400441/week @ 2025-10-20 2632429/week @ 2025-10-27 2732623/week @ 2025-11-03 2361943/week @ 2025-11-10

10,280,234 downloads per month
Used in 12,019 crates (311 directly)

MIT/Apache

710KB
24K SLoC

unicode-normalization

Build Status Docs

Unicode character composition and decomposition utilities as described in Unicode Standard Annex #15.

This crate requires Rust 1.36+.

extern crate unicode_normalization;

use unicode_normalization::char::compose;
use unicode_normalization::UnicodeNormalization;

fn main() {
    assert_eq!(compose('A','\u{30a}'), Some('Å'));

    let s = "ÅΩ";
    let c = s.nfc().collect::<String>();
    assert_eq!(c, "ÅΩ");
}

crates.io

You can use this package in your project by adding the following to your Cargo.toml:

[dependencies]
unicode-normalization = "0.1.25"

no_std + alloc support

This crate is completely no_std + alloc compatible. This can be enabled by disabling the std feature, i.e. specifying default-features = false for this crate on your Cargo.toml.

Note about MSRV

Dependencies' MSRVs evolve independently of this crate's MSRV. Old versions of cargo will always try to get the most recent versions of the dependencies. Therefore, if you are having troubles compiling on an old Rust version, try to install an older version of the incompatible dependency.

For instance, to compile on Rust 1.36, tinyvec must be <=1.6.0

cargo update -p tinyvec --precise 1.6.0

Dependencies