rfc9839 0.2.0

Implementation of the RFC 9839 specification
Documentation
  • Coverage
  • 100%
    10 out of 10 items documented10 out of 10 items with examples
  • Size
  • Source code size: 36.84 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 1.61 MB This is the summed size of all files generated by rustdoc for all configured targets
  • Ø build duration
  • this release: 14s Average build duration of successful builds.
  • all releases: 10s Average build duration of successful builds in releases after 2024-10-23.
  • Links
  • ryanfowler/rfc9839-rs
    1 0 0
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • ryanfowler

rfc9839

Crates.io Docs.rs License

Validation of RFC 9839 Unicode subsets in Rust.

RFC 9839 defines three nested subsets of Unicode characters for use in text protocols:

  • Unicode Scalars – all code points except UTF-16 surrogates. Every Rust char is already a scalar value; checks are included for completeness and for raw byte validation.
  • XML Characters{ TAB, LF, CR } ∪ [0x20–0xD7FF] ∪ [0xE000–0xFFFD] ∪ [0x10000–0x10FFFF]. This is the XML “Char” production with legacy controls and noncharacters excluded.
  • Unicode Assignables – “not problematic” characters: useful controls, printable ASCII (excluding DEL/C1), and all assigned scalars minus standardized noncharacters (…FFFE/FFFF in each plane and U+FDD0–FDEF).

Features

  • Character-level APIs: is_unicode_scalar_char, is_xml_char, is_unicode_assignable_char
  • String-level APIs: is_unicode_scalar, is_xml_chars, is_unicode_assignable
  • Byte-level APIs: is_unicode_scalar_bytes, is_xml_chars_bytes, is_unicode_assignable_bytes
  • ASCII fast-path: tight loops for ASCII data, falling back to chars() only after the first non-ASCII byte
  • Zero allocations, no lookup tables

Example

use rfc9839::*;

// Scalars (always true for safe Rust strings)
assert!(is_unicode_scalar("hello 🌍"));

// XML Characters
assert!(is_xml_chars("ok\tline\n"));
assert!(!is_xml_chars("\u{0000}")); // NUL is disallowed

// Unicode Assignables
assert!(is_unicode_assignable("emoji 👍"));
assert!(!is_unicode_assignable("\u{007F}")); // DEL is excluded