Iconvex Standards

iconvex_standards adds the standards, registry, and archival codecs that do not belong in the small Iconvex core. It is pure Elixir: no NIF, port, or system iconv process is used.

Starting the OTP application atomically installs 248 collision-reviewed byte codecs and 205 table providers into Iconvex. Stopping it removes exactly that extension. A failed or conflicting installation is rolled back in full.

Install

def deps do
[
{:iconvex, "~> 0.1"},
{:iconvex_standards, "~> 0.1"}
]
end

The application starts automatically:

{:ok, koi8} = Iconvex.convert("Привет", "UTF-8", "KOI8-F")
{:ok, "Привет"} = Iconvex.convert(koi8, "KOI8-F", "UTF-8")
{:ok, bootstring} =
Iconvex.convert("Καλημέρα 日本語", "UTF-8", "PUNYCODE")
{:ok, "Καλημέρα 日本語"} =
Iconvex.convert(bootstring, "PUNYCODE", "UTF-8")
{:ok, mailbox_name} =
Iconvex.convert("旅行/日本", "UTF-8", "UTF-7-IMAP")

All normal Iconvex conversion policies remain available, including strict errors, discard, byte substitution, and Unicode substitution.

What is in the package?

The frozen package manifest contains:

SurfaceCountHighlights
Registered byte codecs248143 RFC 1345 sets, ISO-IR, ISCII, Punycode, IMAP UTF-7, VIQR, VSCII-2, PASCII, KOI, Kermit, TACE-16
Table providers205Package-local, immutable ETF lookup tables
Packed profiles5ECMA-1 six-bit plus four seven-bit profiles, each MSB- and LSB-first
Property-token mappings4Unicode 17 mainland/Taiwan telegraph and kGB3
Raw transports2ECMA-44 seven- and eight-bit punched-card combinations
Catalogued quarantine2Fully mapped RFC 1345 tables intentionally not registered

The larger generated families are 143 registered RFC 1345 codecs, 14 IANA PCL symbol sets, 12 modern ISO-IR sets, seven CNS 11643 sets, six historical graphic sets, five mosaic/technical sets, four Unicode legacy mappings, three JIS X 0213 sets, and two KPS 9566-97 profiles.

Notable algorithmic and source-qualified codecs include:

Iconvex.Standards.encodings/0 returns the exact registered canonical names. Iconvex.Standards.registrations/0 also exposes aliases and source provenance. The machine-readable ownership authority is SURFACE_MANIFEST.tsv.

Odd-width transports without pretending bits are bytes

The byte codec API represents one six- or seven-bit unit per octet. For wire formats, use the explicit packed facade:

alias Iconvex.Standards.Packed
{:ok, bits} =
Packed.encode_from_utf8("ABC", "ECMA-1-PACKED-MSB")
{:ok, "ABC"} =
Packed.decode_to_utf8(bits, "ECMA-1-PACKED-MSB")
{:ok, lsb_transport} =
Packed.encode_from_utf8("Привет", "SHORT-KOI-PACKED-LSB")
{:ok, "Привет"} =
Packed.decode_to_utf8(lsb_transport, "SHORT-KOI-PACKED-LSB")

LSB-first data is returned as Iconvex.Packed.LSB, retaining the exact bit length, unit width, and bit order. Passing an explicitly named MSB profile with :lsb (or vice versa) is rejected instead of silently changing the transport.

Unicode property tokens are not byte encodings

The Unihan telegraph and kGB3 values are single property tokens. They therefore implement Iconvex.Standards.PropertyTokenMapping, not Iconvex.Codec:

alias Iconvex.Standards.Unihan17MainlandTelegraphDecimalToken, as: Telegraph
{:ok, scalar} = Telegraph.decode_token("0001")
{:ok, token} = Telegraph.encode_scalar(scalar)

Taiwan telegraph offers separate readable and lossless-VPUA reverse policies. The distinction prevents duplicate and normalization-sensitive property values from being presented as a fictitious concatenated byte-stream encoding.

Verification

The package's RED/GREEN suite includes the 197 migrated source tests plus package-boundary tests. It exhaustively traverses every decode and canonical encode entry in all 205 provider tables, all single-byte inputs, all 13,069 ISCII oracle vectors, every TACE-16 word in both byte orders, every packed source unit in both bit orders, and all 7,236 kGB3 property/GL rows. Lifecycle tests force a provider collision and verify complete rollback.

Run it locally:

ICONVEX_PATH=../iconvex mix test --warnings-as-errors
elixir tools/generate_surface_module.exs --check

Performance and scaling gates live in bench/ and are documented in BENCHMARKS.md. Test chronology is retained in TDD_LOG.md.

License and provenance

Original Iconvex code is LGPL-2.1-or-later, matching GNU libiconv. Packaged upstream evidence retains its own Unicode, BSD-3-Clause, MIT, or PSF terms. See NOTICE and the accompanying license files.