1 module utils.encoding; 2 3 import 4 std.conv, 5 std..string, 6 std.encoding, 7 std.exception, 8 std.windows.charset, 9 10 core.stdc.errno, 11 12 utils.except, 13 utils.encoding.iconv; 14 15 16 static immutable string[ushort] encodingsTable; 17 18 shared static this() 19 { 20 encodingsTable = 21 [ 22 437: `IBM437`, 23 708: `ASMO-708`, 24 775: `IBM775`, 25 850: `IBM850`, 26 852: `IBM852`, 27 855: `IBM855`, 28 857: `IBM857`, 29 860: `IBM860`, 30 861: `IBM861`, 31 863: `IBM863`, 32 864: `IBM864`, 33 865: `IBM865`, 34 866: `CP866`, 35 869: `IBM869`, 36 874: `WINDOWS-874`, 37 932: `SHIFT_JIS`, 38 936: `GB2312`, 39 949: `KS_C_5601-1987`, 40 950: `BIG5`, 41 1200: `UTF-16`, 42 1250: `WINDOWS-1250`, 43 1251: `WINDOWS-1251`, 44 1252: `WINDOWS-1252`, 45 1253: `WINDOWS-1253`, 46 1254: `WINDOWS-1254`, 47 1255: `WINDOWS-1255`, 48 1256: `WINDOWS-1256`, 49 1257: `WINDOWS-1257`, 50 1258: `WINDOWS-1258`, 51 1361: `JOHAB`, 52 10000: `MACINTOSH`, 53 12000: `UTF-32`, 54 12001: `UTF-32BE`, 55 20127: `US-ASCII`, 56 20866: `KOI8-R`, 57 20932: `EUC-JP`, 58 21866: `KOI8-U`, 59 28591: `ISO-8859-1`, 60 28592: `ISO-8859-2`, 61 28593: `ISO-8859-3`, 62 28594: `ISO-8859-4`, 63 28595: `ISO-8859-5`, 64 28596: `ISO-8859-6`, 65 28597: `ISO-8859-7`, 66 28598: `ISO-8859-8`, 67 28599: `ISO-8859-9`, 68 28603: `ISO-8859-13`, 69 28605: `ISO-8859-15`, 70 50221: `CSISO2022JP`, 71 50222: `ISO-2022-JP`, 72 50225: `ISO-2022-KR`, 73 51932: `EUC-JP`, 74 51936: `EUC-CN`, 75 51949: `EUC-KR`, 76 52936: `HZ-GB-2312`, 77 54936: `GB18030`, 78 65000: `UTF-7`, 79 ]; 80 } 81 82 auto decode(string s, ushort cp) 83 { 84 version(linux) 85 { 86 s = iconv(s, encodingsTable[cp], `UTF-8`); 87 } 88 else 89 { 90 s = fromMBSz(s.toStringz, cp); 91 } 92 93 assert(s.isValid); 94 return s; 95 } 96 97 auto encode(string s, ushort cp) 98 { 99 assert(s.isValid); 100 101 version(linux) 102 { 103 return iconv(s, `UTF-8`, encodingsTable[cp]); 104 } 105 else 106 { 107 return toMBSz(s, cp).fromStringz.assumeUnique; 108 } 109 }