Changelog
Source:NEWS.md
punycoder (development version)
New features
-
host_normalize()gains three UTS #46 processing flags —check_hyphens,use_std3, andverify_dns_length— each defaulting toTRUE(the strictuts46-nontransitional-std3-v1profile) and each independently relaxable. These are standard UTS #46 parameters, not a browser mode:CheckBidiandCheckJoinersalways apply, and full WHATWG host policy lives upstack. Pass the same flag values tonormalization_profile_info()for the matching profile identity.
Deprecated
-
url_encode(),url_decode(), andparse_url()are deprecated and now emit a.Deprecated()warning on use. They remain exported and fully functional for this release and are scheduled for removal in the next one. These were always best-effort host extraction/rewriting, not RFC 3986 / WHATWG URL parsing; use therurlpackage for URL parsing and canonicalization, or pass the host alone tohost_normalize()/puny_encode()/puny_decode()for host-only needs.
Breaking changes
-
host_normalize()no longer takes astrictargument. It was inert (always applied the full profile) and reserved for exactly this relaxed variant, which the three explicit flags above now provide.
Internal
-
host_normalize()is now verified against the official Unicode UTS #46 conformance corpus (IdnaTestV2.txt, Unicode 16.0.0). The suite confirms full non-transitional ToASCII conformance, with one documented profile divergence: the trailing FQDN root dot is permitted (strictVerifyDnsLengthwould reject the empty root label).
punycoder 1.1.0
CRAN release: 2026-06-16
New Features
-
host_normalize()converts hostnames to their canonical comparison form under a pinned UTS-46 profile (non-transitional,UseSTD3ASCIIRules,CheckHyphens,CheckBidi,CheckJoiners, NFC, DNS length verification), returning lowercase ASCII A-labels orNAfor invalid input. The mapping/NFC/validation pipeline is implemented in-tree over vendored Unicode 16.0.0 data, so behavior is independent of whether libidn2 is present. -
normalization_profile_info()exposes the machine-readable profile identity (profile,unicode_version, and the profile parameters) for downstream reproducibility keys.
punycoder 1.0.0
CRAN release: 2026-06-11
First CRAN release.
Bug Fixes
-
puny_decode()(and the URL/domain decoders) now bound label length in both strict and non-strict mode. A crafted oversizedxn--label previously drove the fallback decoder into quadratic time with unbounded allocation; oversized labels are now rejected promptly (error in strict mode,NAin non-strict).
New Features
- Strict decoding now enforces RFC 5891 canonical A-label form: a decoded label must re-encode to itself. Non-canonical encodings (e.g. uppercase payloads) are rejected in strict mode while non-strict decoding stays lenient.
- Initial release of punycoder package
- Core punycode encoding and decoding functions (
puny_encode(),puny_decode()) - URL-aware processing functions (
url_encode(),url_decode(),parse_url()) - Domain validation and utility functions (
is_punycode(),is_idn(),validate_domain()) - Comprehensive test suite with RFC 3492 compliance testing
- High-performance C++ backend with Rcpp
- Vectorized operations for bulk processing
- Robust error handling and validation
- Complete documentation with vignettes
Package Structure
- CRAN-compliant package structure
- MIT license
- Comprehensive test coverage
- Performance optimizations
- Cross-platform compatibility (Windows, macOS, Linux)
Technical Implementation
- C++ backend using Rcpp for performance
- Placeholder implementation ready for libidn2 integration
- RFC 3492 compliance framework
- Extensive input validation
- Memory-efficient vectorized operations