Iconvex Extras

iconvex_extras is the GNU libiconv 1.19 --enable-extra-encodings companion for Iconvex. It adds 86 codecs to Core's 112 GNU-default codecs. The set contains 7 GNU extra, 9 AIX, 15 DOS, 2 OSF/1, and 53 z/OS encodings.

def deps do
[
{:iconvex, "~> 0.1.1"},
{:iconvex_extras, "~> 0.1.1"}
]
end

Start the application:

{:ok, "Café"} = Iconvex.convert(<<0x43, 0x61, 0x66, 0x82>>, "CP437", "UTF-8")
{:ok, "IBM-1047"} = Iconvex.canonical_name("CP1047")
{:ok, all} = Application.ensure_all_started(:iconvex_extras)
198 = length(Iconvex.encodings())

Stopping Extras returns the runtime to the 112 Core codecs. Restarting Extras restores all 198 codecs. Extras contributes 342 normalized GNU spelling keys. Core and Extras provide 758 GNU spellings in total.

One atomic extension

The application publishes 86 codec routes and the :euc_jisx0213 table provider. It uses one Iconvex.Extension.register/2 transaction. One opaque token owns the complete commit.

A conflict at any route rolls back all new routes and the provider. Shutdown removes only records that the token still owns. Stop, restart, and supervised registry-worker restart preserve the same ownership guarantees.

Extras uses managed priority 300. Therefore, GNU compatibility aliases outrank aliases from lower-priority source leaves. Core built-ins resolve first. Canonical claims outrank aliases at every package priority.

The package contains 85 mapping tables and the ISO-2022-JP-3 state machine. Shared Core engines provide native linear paths for strict, discard, callback, and substitution policies. The runtime uses no NIF or operating-system iconv dependency.

Extras is one leaf in the final package split. The runtime packages expose 2,105 unique canonical codecs. The unpublished research workspace owns no runtime routes. Extras depends only on Iconvex Core.

Exact support and evidence

SUPPORTED_ENCODINGS.md contains the generated 86-codec list and each GNU origin. SUPPORTED_CODEC_INVENTORY.csv contains the machine-readable inventory. Its columns cover canonical names, aliases, modules, and statefulness.

The tests port all 85 applicable GNU mapping and inverse fixtures. They cover ISO-2022-JP-3 state, streaming, IBM-1047 policies, invalid-input recovery, aliases, and lifecycle behavior.

The sequential UCS-4BE corpus contains every code point from U+0000 through U+10FFFF. It contains 1,112,064 Unicode scalar values and all 2,048 surrogate code points.

EXHAUSTIVE_UNICODE_DIFFERENTIAL.md records the 198-codec comparison with GNU libiconv 1.19. It covers forward, reverse, and cross-decode directions. The final run has zero mismatches across all 1,114,112 code points.

A C11 in-memory GNU helper measures forward and reverse performance. The 30x limit applies to each direction. Both engines use one fixed iteration count. At each doubling, calibration uses the fastest of three probes. That probe must reach 10,000,000 ns. A delayed probe cannot end calibration early.

The report uses the fastest of three final batches. EUC-JISX0213 measures 2.95x forward and 15.38x reverse. CP943 measures 4.03x forward and 20.92x reverse. ISO-2022-CN has the highest ratio at 24.80x.

ICONVEX_PATH=../iconvex mix test --warnings-as-errors
ICONVEX_PATH=../iconvex mix compile --warnings-as-errors
ICONVEX_PATH=../iconvex MIX_ENV=prod mix run bench/benchmark.exs
GNU_ICONV=/path/to/gnu-libiconv-1.19/bin/iconv \
ICONVEX_PATH=../iconvex MIX_ENV=prod \
mix run tools/exhaustive_unicode_differential.exs

The C helper supports offline tests and benchmarks. The runtime does not include it. The Hex artifact contains runtime source, tables, licenses, inventories, and public evidence. It excludes test/, bench/, tools/, PDFs, and large development corpora.

ICONVEX_PATH provides a development override for sibling checkouts. Published builds use {:iconvex, "~> 0.1.1"} from Hex.

Complete codec catalog

The generator builds this table from the release inventories. Do not edit this section by hand. Codec names ignore ASCII letter case. You can use each alias to look up its codec. Aliases do not increase the canonical codec count.

86 canonical codecs · 256 aliases · 342 accepted names.

Registered codec names

Canonical codecAccepted aliasesStateful
ATARISTATARINo
BIG5-2003No
CP1046IBM-1046No
CP1124IBM-1124No
CP1125IBM-1125No
CP1129IBM-1129No
CP1161CSIBM1161
IBM-1161
IBM1161
No
CP1162CSIBM1162
IBM-1162
IBM1162
No
CP1163CSIBM1163
IBM-1163
IBM1163
No
CP437437
CSPC8CODEPAGE437
IBM-437
IBM437
No
CP737No
CP775CSPC775BALTIC
IBM775
No
CP852852
CSPCP852
IBM-852
IBM852
No
CP853No
CP855855
CSIBM855
IBM-855
IBM855
No
CP856IBM-856No
CP857857
CSIBM857
IBM-857
IBM857
No
CP858No
CP860860
CSIBM860
IBM-860
IBM860
No
CP861861
CP-IS
CSIBM861
IBM-861
IBM861
No
CP863863
CSIBM863
IBM-863
IBM863
No
CP864CSIBM864
IBM-864
IBM864
No
CP865865
CSIBM865
IBM-865
IBM865
No
CP869869
CP-GR
CSIBM869
IBM-869
IBM869
No
CP922IBM-922No
CP943IBM-943
SJIS-1
SJIS-2
No
DEC-HANYUDECHANYUNo
DEC-KANJIDECKANJINo
EUC-JISX0213EUC-JIS-2004No
IBM-037CP037
CSIBM037
EBCDIC-CP-CA
EBCDIC-CP-NL
EBCDIC-CP-US
EBCDIC-CP-WT
IBM037
No
IBM-1025CP1025
IBM1025
No
IBM-1026CP1026
CSIBM1026
IBM1026
No
IBM-1047CP1047
CSIBM1047
IBM1047
No
IBM-1097CP1097
IBM1097
No
IBM-1112CP1112
IBM1112
No
IBM-1122CP1122
IBM1122
No
IBM-1123CP1123
IBM1123
No
IBM-1130CP1130
IBM1130
No
IBM-1132CP1132
IBM1132
No
IBM-1137CP1137
IBM1137
No
IBM-1140CCSID01140
CP01140
CSIBM01140
EBCDIC-US-37+EURO
IBM01140
IBM1140
No
IBM-1141CCSID01141
CP01141
CSIBM01141
EBCDIC-DE-273+EURO
IBM01141
IBM1141
No
IBM-1142CCSID01142
CP01142
CSIBM01142
EBCDIC-DK-277+EURO
EBCDIC-NO-277+EURO
IBM01142
IBM1142
No
IBM-1143CCSID01143
CP01143
CSIBM01143
EBCDIC-FI-278+EURO
EBCDIC-SE-278+EURO
IBM01143
IBM1143
No
IBM-1144CCSID01144
CP01144
CSPC8CODEPAGE1144
EBCDIC-IT-280+EURO
IBM01144
IBM1144
No
IBM-1145CCSID01145
CP01145
CSIBM01145
EBCDIC-ES-284+EURO
IBM01145
IBM1145
No
IBM-1146CCSID01146
CP01146
CSPC8CODEPAGE1146
EBCDIC-GB-285+EURO
IBM01146
IBM1146
No
IBM-1147CCSID01147
CP01147
CSIBM01147
EBCDIC-FR-297+EURO
IBM01147
IBM1147
No
IBM-1148CCSID01148
CP01148
CSIBM01148
EBCDIC-INTERNATIONAL-500+EURO
IBM01148
IBM1148
No
IBM-1149CCSID01149
CP01149
CSIBM01149
EBCDIC-IS-871+EURO
IBM01149
IBM1149
No
IBM-1153CP1153
IBM1153
No
IBM-1154CP1154
IBM1154
No
IBM-1155CP1155
IBM1155
No
IBM-1156CP1156
IBM1156
No
IBM-1157CP1157
IBM1157
No
IBM-1158CP1158
IBM1158
No
IBM-1160CP1160
IBM1160
No
IBM-1164CP1164
IBM1164
No
IBM-1165IBM1165No
IBM-1166CP1166
IBM1166
No
IBM-12712CP12712
IBM12712
No
IBM-16804CP16804
IBM16804
No
IBM-273CP273
CSIBM273
IBM273
No
IBM-277CSIBM277
EBCDIC-CP-DK
EBCDIC-CP-NO
IBM277
No
IBM-278CP278
CSIBM278
EBCDIC-CP-FI
EBCDIC-CP-SE
IBM278
No
IBM-280CP280
CSIBM280
EBCDIC-CP-IT
IBM280
No
IBM-282IBM282No
IBM-284CP284
CSIBM284
EBCDIC-CP-ES
IBM284
No
IBM-285CP285
CSIBM285
EBCDIC-CP-GB
IBM285
No
IBM-297CP297
CSIBM297
EBCDIC-CP-FR
IBM297
No
IBM-423CP423
CSIBM423
EBCDIC-CP-GR
IBM423
No
IBM-424CP424
CSIBM424
EBCDIC-CP-HE
IBM424
No
IBM-425IBM425No
IBM-4971CP4971
IBM4971
No
IBM-500CP500
CSIBM500
EBCDIC-CP-BE
EBCDIC-CP-CH
IBM500
No
IBM-838CSIBMTHAI
IBM-THAI
IBM838
No
IBM-870CP870
CSIBM870
EBCDIC-CP-ROECE
EBCDIC-CP-YU
IBM870
No
IBM-871CP871
CSIBM871
EBCDIC-CP-IS
IBM871
No
IBM-875CP875
EBCDIC-GREEK
IBM875
No
IBM-880CP880
CSIBM880
EBCDIC-CYRILLIC
IBM880
No
IBM-905CP905
CSIBM905
EBCDIC-CP-TR
IBM905
No
IBM-924CCSID00924
CP00924
CSIBM00924
EBCDIC-LATIN9-EURO
IBM00924
IBM924
No
ISO-2022-JP-3ISO-2022-JP-2004Yes
RISCOS-LATIN1No
SHIFT_JISX0213SHIFT_JIS-2004No
TDS565ISO-IR-230No