╔══──--∙·. .·∙-──────────────────────══════╗
║ ▪ ▄▄· ▐ ▄ ▌ ▐·▄▄▄▄▄▄ ▪ ▐ ▄·▄· ▄▌ ║
│ ██ ▐█ ▌▪▪ •█▌▐█▪█·▐▌ •██ ██ •█▌▐█ █▪█▌ ║
│ ▐█·██ ▄▄ ▄█▀▄ ▐█▐▐▌ ▐ █ •▄•▐█.▪▐█·▐█▐▐▌ ▐█▪ │
│ ▐█▌▐█ █▌▐█▌.▐▌█▌▐█▌ ▐█▌ ▐█▌·▐█ █▌▐█▌ ▐█·. │
│ ▀▀▀·▀▀▀ ▀█▄▀▪▀ █▪. ▀ ▀▀▀ ▀▀ ▀ █▪ ▀ • │
└──────--∙· ·∙-───────────────by─ViP-DeLeTe──┘
Pure JS ESM Encodings Set for Browser and NodeJS. Auto-Generated from http://www.unicode.org/Public/MAPPINGS.
Features
- No dependencies.
- Encoding mappings overrides. Can be used to display IBM PC memory-mapped symbols for 0-31 control codes.
- DefaultChar override.
- Native TextDecoder for supported encodings (ISO-8859-* and windows-125*)
- Typescript friendly.
- Tiny: ~400 bytes per encoding, ~24KB of full bundle.mjs, ~9KB in gzip.
Installation
npm install iconv-tiny
import { IconvTiny } from "iconv-tiny";
import { aliases } from "iconv-tiny/aliases";
import * as encodings from "iconv-tiny/encodings";
const iconvTiny = new IconvTiny(encodings, aliases);
const buf = iconvTiny.encode("Hello", "UTF-16");
console.log(buf); // Uint8Array(10) [72, 0, 101, 0, 108, 0, 108, 0, 111, 0]
const str = iconvTiny.decode(buf, "UTF-16");
console.log(str); // Hello
or directly import from CDN without installation:
import { IconvTiny, aliases, encodings } from "https://unpkg.com/iconv-tiny@1.1.0/dist/iconv-tiny.bundle.mjs";
const iconv = new IconvTiny(encodings, aliases);
const buf = iconv.encode("Le malheur est notre plus grand maître.", "cp1252")
...
or import encodings individually:
import { CP1251 } from "https://unpkg.com/iconv-tiny@1.1.0/dist/iconv-tiny.bundle.mjs";
const cp1251 = CP1251.create();
const buf = cp1251.encode("Век живи — век учись.");
const str = cp1251.decode(buf);
console.log(buf); // [ 194, 229, 234, 32, 230, 232, ... ]
console.log(str); // Век живи — век учись.
See more examples.
Commands
Build:
npm run build
Note: You need JDK 21 or higher installed to compile the source code using the Google Closure Compiler.
Run tests:
npm run test
Run Coverage:
npm run coverage
Start UI:
npm run dev
Supported encodings:
- ISO-8859: 1,2,3,4,5,6,7,8,9,10,11,13,14,15,16
- EBCDIC: Cp037, Cp500, Cp875, Cp1026
- DOS: Cp437, Cp737, Cp775, Cp850, Cp852, Cp855, Cp857, Cp860, Cp861, Cp862, Cp863, Cp864, Cp865, Cp866, Cp869, Cp874
- WINDOWS: Cp1250, Cp1251, Cp1252, Cp1253, Cp1254, Cp1255, Cp1256, Cp1257, Cp1258
- MAC: CYRILLIC, GREEK, ICELAND, LATIN2, ROMAN, TURKISH
- MISC: ATARIST, Cp424, CP856, Cp1006, KOI8-R, KOI8-U, KZ1048, NEXTSTEP
- OTHER: US-ASCII
- UNICODE: UTF-8, UTF-16, UTF-32
iconv-tiny output is identical to iconv-lite output, see tests/regression.test.mjs.
BOM Handling
- UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE:
- Decoding: BOM is stripped by default, unless overridden by
stripBOM: false
option. - Encoding: No BOM added, unless overridden by
addBOM: true
option.
- Decoding: BOM is stripped by default, unless overridden by
- UTF-16 is an alias of UTF-16LE
- UTF-32 is an alias of UTF-32LE
Performance
iconv-tiny vs iconv-lite
- iconv-tiny is Browser oriented and doesn't use any NodeJS specific API like Buffer.
- iconv-tiny can use native TextDecoder by
native: true
option. - iconv-tiny supports
encodeInto(Uint8Array)
, and there are no memory allocations. - iconv-lite uses NodeJS API and much faster for UTF-16 Encode/Decode in Node.
- iconv-lite uses NodeJS's Buffer, but iconv-tiny uses Uint8Array.
Below are the tests in NodeJS:
/> node tests/perf-test-cp1251.mjs
Encode 256KB text 10000 times:
iconv-lite: 4837 ms, 516.8 Mb/s.
iconv-tiny: 4228 ms, 591.3 Mb/s.
Decode 256KB array 10000 times:
iconv-lite: 17314 ms, 144.4 Mb/s.
iconv-tiny: 20400 ms, 122.5 Mb/s.
iconv-tiny: 11530 ms, 216.8 Mb/s. <--- native: true
/> node tests/perf-test-unicode.mjs
UTF8: Encode:
iconv-lite: 4097 ms, 204.0 Mb/s.
iconv-tiny: 1668 ms, 501.1 Mb/s. <-- TextEncoder
UTF8: Decode:
iconv-lite: 7103 ms, 117.7 Mb/s.
iconv-tiny: 2960 ms, 282.4 Mb/s. <-- TextEncoder
UTF16: Encode:
iconv-lite: 262 ms, 3190.5 Mb/s. <-- NodeJS API
iconv-tiny: 6130 ms, 136.4 Mb/s. <-- "software" encode
UTF16: Decode:
iconv-lite: 328 ms, 2548.5 Mb/s. <-- NodeJS API
iconv-tiny: 1103 ms, 757.9 Mb/s. <-- TextDecoder
UTF32: Encode:
iconv-lite: 12391 ms, 67.5 Mb/s.
iconv-tiny: 5787 ms, 144.4 Mb/s.
UTF32: Decode:
iconv-lite: 3856 ms, 216.8 Mb/s.
iconv-tiny: 4494 ms, 186.0 Mb/s. <-- "software" decode
Demo
https://vip-delete.github.io/iconv-tiny/
