Packages

Pure Elixir platform-specific encoding extensions for Iconvex

Current section

Files

Jump to
Raw

README.md

# Iconvex Platforms
`iconvex_platforms` adds 117 pure-Elixir, vendor- and platform-qualified codecs
to [Iconvex](https://hex.pm/packages/iconvex).
The package contributes 354 unique registry names.
This total includes 117 canonical names and 237 aliases.
The runtime uses no NIFs, ports, subprocesses, or calls to `iconv`.
The OTP application registers the complete surface and tables in one transaction.
Stopping it removes those routes and providers.
## Installation
```elixir
def deps do
[
{:iconvex, "~> 0.1"},
{:iconvex_platforms, "~> 0.1"}
]
end
```
## Conversion examples
IBM-1175 is the Turkish EBCDIC euro-and-lira revision:
```elixir
iex> Iconvex.convert("TRY ₺€", "UTF-8", "IBM-1175")
{:ok, <<0xE3, 0xD9, 0xE8, 0x40, 0x9A, 0x9F>>}
```
GNU glibc's BRF map turns Braille ASCII cells into Unicode Braille:
```elixir
iex> Iconvex.convert("AB", "BRF", "UTF-8")
{:ok, "⠁⠃"}
```
The package keeps the four VietUnicode VNI transports distinct.
This example uses the 2002 ANSI Win/Unix profile.
```elixir
iex> Iconvex.convert("Việt", "UTF-8", "VIETUNICODE-2002-VNI-ANSI-WIN-UNIX")
{:ok, <<0x56, 0x69, 0x65, 0xE4, 0x74>>}
```
Windows best-fit mappings use directional rules.
```elixir
iex> Iconvex.convert("−", "UTF-8", "WINDOWS-BESTFIT-1252")
{:ok, "-"}
iex> Iconvex.convert("-", "WINDOWS-BESTFIT-1252", "UTF-8")
{:ok, "-"}
```
Java Modified UTF-8 rejects a literal zero byte and accepts the two-byte NUL:
```elixir
iex> Iconvex.convert(<<0xC0, 0x80>>, "JAVA-MODIFIED-UTF-8", "UTF-8")
{:ok, <<0>>}
```
The stateful IBM-965 and IBM-17354 codecs emit designation and shift
sequences, while `UTF-8-MAC` implements the HFS Plus decomposition profile:
```elixir
iex> {:ok, encoded} = Iconvex.convert("A一", "UTF-8", "IBM-965")
iex> Iconvex.convert(encoded, "IBM-965", "UTF-8")
{:ok, "A一"}
iex> Iconvex.convert("é", "UTF-8", "UTF-8-MAC")
{:ok, "é"}
```
## Package contents
| Family | Codecs | Examples |
|---|---:|---|
| glibc charmaps | 29 | TSCII, BRF, EUC-JP-MS, ISO_6937, KOI-8 |
| Adobe and Apple legacy maps | 28 | Adobe Standard, MacJapanese, MacKeyboard |
| platform and specification profiles | 30 | IBM-1175, IBM-965, Java Modified UTF-8, UTF-8-MAC |
| Windows best-fit | 15 | 874, 932, 936, 949, 950, 1250–1258, 1361 |
| Evertype source-qualified | 7 | Mac Armenian, Ogham, Georgian, Turkic Cyrillic |
| VietUnicode VNI 2002 | 4 | DOS, ANSI, Mac, Internet Mail |
| secondary source-qualified | 3 | Wang WISCII, EKI Sami CP1270, Polytonic Greek |
| Unicode legacy | 1 | US-ASCII-QUOTES |
Use `Iconvex.Platforms.encodings/0` for the canonical list.
Use `Iconvex.Platforms.registrations/0` for aliases, modules, and source families.
[`SURFACE_MANIFEST.tsv`](SURFACE_MANIFEST.tsv) provides the immutable row-by-row contract.
## Archive-independent IBM tables
Earlier code routed IBM-1175, IBM-965, and IBM-17354 through ICU Archive provider IDs.
IBM-934/938 and IBM-5052/5053/5055/958 also used seven internal Archive tables.
Platforms copies all ten immutable tables under package-owned IDs.
It does not depend on `iconvex_icu_archive` or claim an Archive provider.
Therefore, both optional packages can run without provider ownership collisions.
The package owns 84 tables.
The total includes 73 manifest providers, ten relocated IBM dependencies,
and the pinned glibc IBM423 table.
## Verification
The test suite contains the original source fixtures and a 1,112,064-scalar UTF-32BE corpus.
It verifies each row and canonical inverse in the generated mapping families.
It checks all 94×94 positions for IBM-965 and IBM-17354.
It checks every byte and inverse for each single-byte profile.
Additional tests cover:
- Stateful behavior and conversion policies.
- UTF-8 offsets and lifecycle behavior.
- Artifact contents, digests, and licenses.
Representative source-bound benchmarks enforce a 30× native/reference ceiling
and linear reduction scaling. See [`BENCHMARKS.md`](BENCHMARKS.md).
## Extending Iconvex
Third-party packages can use `Iconvex.Extension.register/2` for transactional registration.
Platforms is a leaf package.
Its only runtime dependency is Iconvex Core.
Its runtime does not reference the former monolithic Specs namespace.
## License and provenance
The original Iconvex code uses LGPL-2.1-or-later.
Retained mapping and source artifacts keep their upstream terms.
See [`NOTICE`](NOTICE) and the shipped license files.
<!-- iconvex-codec-catalog:start -->
## 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.
**117 canonical codecs · 237 aliases · 354 accepted names.**
### Registered codec names
| Canonical codec | Accepted aliases | Stateful |
|---|---|:---:|
| `ADOBE-STANDARD-ENCODING` | `AdobeStandardEncoding`<br>`csAdobeStandardEncoding`<br>`POSTSCRIPT-STANDARD-ENCODING` | No |
| `ADOBE-SYMBOL-ENCODING` | `AdobeSymbolEncoding` | No |
| `Amiga-1251` | `Ami-1251`<br>`Ami1251`<br>`Amiga1251`<br>`csAmiga1251` | No |
| `BRF` | `Braille-ASCII`<br>`Braille-Ready-Format` | No |
| `CP1090` || No |
| `CP51950` | `windows-51950` | No |
| `CP770` || No |
| `CP771` || No |
| `CP772` || No |
| `CP773` || No |
| `CP774` || No |
| `CWI` | `CP-HU`<br>`CWI-2` | No |
| `EBCDIC-IS-FRISS` | `FRISS` | No |
| `EUC-JP-MS` || No |
| `EVERTYPE-2001-LATIN-8-EXTENDED` || No |
| `EVERTYPE-2001-MAC-ARMENIAN` || No |
| `EVERTYPE-2001-MAC-BARENTS-CYRILLIC` || No |
| `EVERTYPE-2001-MAC-MALTESE-ESPERANTO` || No |
| `EVERTYPE-2001-MAC-OGHAM` || No |
| `EVERTYPE-2002-MAC-GEORGIAN` || No |
| `EVERTYPE-2002-MAC-TURKIC-CYRILLIC` || No |
| `GLIBC-IBM423` | `GLIBC-CP423`<br>`GLIBC-EBCDIC-CP-GR`<br>`IBM423-GLIBC` | No |
| `HP-GREEK8` || No |
| `HP-ROMAN9` | `R9`<br>`ROMAN9` | No |
| `HP-THAI8` | `THAI8` | No |
| `HP-TURKISH8` | `TURKISH8` | No |
| `IBM-1116-850-P100-COMPOSITE` | `CP1116-850-P100-COMPOSITE`<br>`IBM-1116-P100-COMPOSITE`<br>`IBM1116-850-P100-COMPOSITE` | No |
| `IBM-1117-437-P100-COMPOSITE` | `CP1117-437-P100-COMPOSITE`<br>`IBM-1117-P100-COMPOSITE`<br>`IBM1117-437-P100-COMPOSITE` | No |
| `IBM-1175` | `CCSID1175`<br>`CP1175`<br>`IBM1175` | No |
| `IBM-1200` | `CCSID1200`<br>`CCSID1201`<br>`CCSID13488`<br>`CCSID13489`<br>`CCSID17584`<br>`CCSID17585`<br>`CCSID21680`<br>`CCSID21681`<br>`CCSID25776`<br>`CCSID25777`<br>`CCSID29872`<br>`CCSID29873`<br>`CCSID61955`<br>`CCSID61956`<br>`IBM-1201`<br>`IBM-13488`<br>`IBM-13489`<br>`IBM-17584`<br>`IBM-17585`<br>`IBM-21680`<br>`IBM-21681`<br>`IBM-25776`<br>`IBM-25777`<br>`IBM-29872`<br>`IBM-29873`<br>`IBM-61955`<br>`IBM-61956`<br>`IBM1200`<br>`IBM1201`<br>`IBM13488`<br>`IBM13489`<br>`IBM17584`<br>`IBM17585`<br>`IBM21680`<br>`IBM21681`<br>`IBM25776`<br>`IBM25777`<br>`IBM29872`<br>`IBM29873`<br>`IBM61955`<br>`IBM61956` | No |
| `IBM-17354` | `CCSID17354`<br>`CP17354`<br>`IBM17354` | Yes |
| `IBM-310-293-P100-COMPOSITE-VPUA` | `CP310-293-P100-COMPOSITE-VPUA`<br>`IBM-310-293-P100-VPUA`<br>`IBM310-293-P100-COMPOSITE-VPUA` | No |
| `IBM-5052` | `CCSID5052`<br>`CCSID956`<br>`CP5052`<br>`CP956`<br>`IBM-956`<br>`IBM5052`<br>`IBM956` | Yes |
| `IBM-5053` | `CCSID5053`<br>`CCSID957`<br>`CP5053`<br>`CP957`<br>`IBM-957`<br>`IBM5053`<br>`IBM957` | Yes |
| `IBM-5055` | `CCSID5055`<br>`CCSID959`<br>`CP5055`<br>`CP959`<br>`IBM-959`<br>`IBM5055`<br>`IBM959` | Yes |
| `IBM-907-CDRA-P100-VPUA-COMPOSITE` | `CP907-CDRA-P100-VPUA-COMPOSITE`<br>`IBM-907-P100-VPUA-COMPOSITE`<br>`IBM907-CDRA-P100-VPUA-COMPOSITE` | No |
| `IBM-934` | `CCSID934`<br>`CP934`<br>`IBM934` | No |
| `IBM-938` | `CCSID938`<br>`CP938`<br>`IBM938` | No |
| `IBM-958` | `CCSID958`<br>`CP958`<br>`IBM958` | Yes |
| `IBM-965` | `CCSID965`<br>`CP965`<br>`IBM965` | Yes |
| `IBM-TNZ-CP310-B1EAE3C` | `CP310-TNZ-07D60F4`<br>`IBM-TNZ-CP310-07D60F4`<br>`TNZ-CP310-07D60F4`<br>`TNZ-CP310-B1EAE3C` | No |
| `IBM1004` | `CP1004`<br>`OS2LATIN1` | No |
| `IBM256` | `EBCDIC-INT1` | No |
| `IBM866NAV` | `866NAV`<br>`CP866NAV` | No |
| `ISIRI-3342` || No |
| `ISO-2022-JP-EXT` | `ISO2022-JP-EXT`<br>`ISO2022_JP_EXT`<br>`PYTHON-ISO2022-JP-EXT` | Yes |
| `ISO-8859-9E` || No |
| `ISO-IR-197` || No |
| `ISO-IR-209` || No |
| `ISO_11548-1` || No |
| `ISO_6937` | `ISO-IR-156`<br>`ISO6937`<br>`ISO_6937:1992` | No |
| `JAVA-MODIFIED-UTF-8` | `ANDROID-DEX-MUTF-8`<br>`DEX-MODIFIED-UTF-8`<br>`DEX-MUTF-8`<br>`JAVA-MUTF-8`<br>`MODIFIED-UTF-8`<br>`MUTF-8` | No |
| `KEYBCS2` | `KAMENICKY`<br>`KAMENICKY-BROTHERS`<br>`KAMENICKY-ORIGINAL`<br>`KEYBCS2-ORIGINAL` | No |
| `KOI-8` || No |
| `LICS` | `LOTUS-INTERNATIONAL-CHARACTER-SET` | No |
| `MAC-IS` || No |
| `MAC-SAMI` || No |
| `MAC-UK` || No |
| `MacCeltic` | `Mac-Celtic`<br>`x-mac-celtic` | No |
| `MacChineseSimp` | `Mac-Simplified-Chinese`<br>`x-mac-chinesesimp` | No |
| `MacChineseTrad` | `Mac-Traditional-Chinese`<br>`x-mac-chinesetrad` | No |
| `MacDevanagari` | `Mac-Devanagari`<br>`x-mac-devanagari` | No |
| `MacDingbats` | `Mac-Dingbats` | No |
| `MacFarsi` | `Mac-Farsi`<br>`x-mac-farsi` | No |
| `MacGaelic` | `Mac-Gaelic`<br>`x-mac-gaelic` | No |
| `MacGujarati` | `Mac-Gujarati`<br>`x-mac-gujarati` | No |
| `MacGurmukhi` | `Mac-Gurmukhi`<br>`x-mac-gurmukhi` | No |
| `MACINTOSH-LATIN` | `MAC-ICELAND-10079`<br>`MAC-LATIN-KERMIT` | No |
| `MacInuit` | `Mac-Inuit`<br>`x-mac-inuit` | No |
| `MacJapanese` | `Mac-Japanese`<br>`x-mac-japanese` | No |
| `MacKeyboard` | `Mac-Keyboard`<br>`x-mac-keyboard` | No |
| `MacKorean` | `Mac-Korean`<br>`x-mac-korean` | No |
| `MACOS_ESPERANTO` | `MAC-ESPERANTO`<br>`MACESPERANTO`<br>`MACOS-ESPERANTO` | No |
| `MacRomanian` | `Mac-Romanian`<br>`x-mac-romanian` | No |
| `MacSymbol` | `Mac-Symbol`<br>`x-mac-symbol` | No |
| `MIK` || No |
| `MYSQL-KEYBCS2` | `KEYBCS2-MYSQL`<br>`MYSQL-KEYBCS2-AD-A1` | No |
| `TSCII` | `TSCII-1.7` | No |
| `UNICODE-APPLE:MacArabic` | `Mac-Arabic` | No |
| `UNICODE-APPLE:MacCentralEurope` | `Mac-Central-Europe`<br>`MacCentEuro` | No |
| `UNICODE-APPLE:MacCroatian` | `Mac-Croatian` | No |
| `UNICODE-APPLE:MacCyrillic` | `Mac-Cyrillic` | No |
| `UNICODE-APPLE:MacGreek` | `Mac-Greek` | No |
| `UNICODE-APPLE:MacHebrew` | `Mac-Hebrew` | No |
| `UNICODE-APPLE:MacIceland` | `Mac-Iceland` | No |
| `UNICODE-APPLE:MacRoman` | `Mac-Roman` | No |
| `UNICODE-APPLE:MacThai` | `Mac-Thai` | No |
| `UNICODE-APPLE:MacTurkish` | `Mac-Turkish` | No |
| `US-ASCII-QUOTES` | `ASCII-TYPOGRAPHIC-QUOTES` | No |
| `UTF-8-MAC` | `UTF-8-HFS`<br>`UTF-8-HFS-PLUS`<br>`UTF8-HFS`<br>`UTF8-MAC` | Yes |
| `UTF-8-SIG` | `PYTHON-UTF-8-SIG`<br>`UTF8-SIG` | Yes |
| `VIETUNICODE-2002-VNI-ANSI-WIN-UNIX` | `ENCODE-VN-0.06-X-VIET-VNI` | No |
| `VIETUNICODE-2002-VNI-ASCII-DOS` | `ENCODE-VN-0.06-X-VIET-VNI-ASCII` | No |
| `VIETUNICODE-2002-VNI-INTERNET-MAIL` | `ENCODE-VN-0.06-X-VIET-VNI-EMAIL` | No |
| `VIETUNICODE-2002-VNI-MAC` | `ENCODE-VN-0.06-X-VIET-VNI-MAC` | No |
| `WANG-1983-WISCII-PDF-F4043449-WIKIPEDIA-REV1352856854` || No |
| `WIKIPEDIA-REV1340817319-EKI-SAMI-WIN-CP1270` || No |
| `WIKIPEDIA-REV1354794598-PARATYPE-WINDOWS-POLYTONIC-GREEK` || No |
| `WIN-SAMI-2` | `WINDOWS-SAMI2`<br>`WS2` | No |
| `WINDOWS-BESTFIT-1250` | `bestfit1250`<br>`Windows-Best-Fit-1250` | No |
| `WINDOWS-BESTFIT-1251` | `bestfit1251`<br>`Windows-Best-Fit-1251` | No |
| `WINDOWS-BESTFIT-1252` | `bestfit1252`<br>`Windows-Best-Fit-1252` | No |
| `WINDOWS-BESTFIT-1253` | `bestfit1253`<br>`Windows-Best-Fit-1253` | No |
| `WINDOWS-BESTFIT-1254` | `bestfit1254`<br>`Windows-Best-Fit-1254` | No |
| `WINDOWS-BESTFIT-1255` | `bestfit1255`<br>`Windows-Best-Fit-1255` | No |
| `WINDOWS-BESTFIT-1256` | `bestfit1256`<br>`Windows-Best-Fit-1256` | No |
| `WINDOWS-BESTFIT-1257` | `bestfit1257`<br>`Windows-Best-Fit-1257` | No |
| `WINDOWS-BESTFIT-1258` | `bestfit1258`<br>`Windows-Best-Fit-1258` | No |
| `WINDOWS-BESTFIT-1361` | `bestfit1361`<br>`Windows-Best-Fit-1361` | No |
| `WINDOWS-BESTFIT-874` | `bestfit874`<br>`Windows-Best-Fit-874` | No |
| `WINDOWS-BESTFIT-932` | `bestfit932`<br>`Windows-Best-Fit-932` | No |
| `WINDOWS-BESTFIT-936` | `bestfit936`<br>`Windows-Best-Fit-936` | No |
| `WINDOWS-BESTFIT-949` | `bestfit949`<br>`Windows-Best-Fit-949` | No |
| `WINDOWS-BESTFIT-950` | `bestfit950`<br>`Windows-Best-Fit-950` | No |
| `x-cp50227` | `CP50227`<br>`windows-50227` | No |
| `x-Europa` | `CP29001`<br>`Europa`<br>`windows-29001` | No |
| `ZAPF-DINGBATS-ENCODING` | `Adobe-Zapf-Dingbats`<br>`Zapf-Dingbats` | No |
<!-- iconvex-codec-catalog:end -->