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 }