1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.jdtaus.banking.charsets.spi;
22
23 import java.nio.ByteBuffer;
24 import java.nio.CharBuffer;
25 import java.nio.charset.Charset;
26 import java.nio.charset.CharsetDecoder;
27 import java.nio.charset.CharsetEncoder;
28 import java.nio.charset.CoderResult;
29 import java.nio.charset.CodingErrorAction;
30 import java.nio.charset.spi.CharsetProvider;
31 import java.util.Iterator;
32 import java.util.NoSuchElementException;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class IBM273CharsetProvider extends CharsetProvider
48 {
49
50
51 static final String COMMON_NAME = "IBM273";
52
53
54 static final String[] ALIAS_NAMES =
55 {
56 "cp273", "csIBM273"
57 };
58
59
60 static final String[] SUPPORTED_NAMES =
61 {
62 COMMON_NAME.toLowerCase(), "cp273", "csIBM273"
63 };
64
65 static final char[] BYTE_TO_CHAR =
66 {
67 '\u0000', '\u0001', '\u0002', '\u0003', '\u009C', '\u0009', '\u0086', '\u007F', '\u0097', '\u008D', '\u008E',
68 '\u000B', '\u000C', 0xD, '\u000E', '\u000F', '\u0010', '\u0011', '\u0012', '\u0013', '\u009D', '\u0085',
69 '\u0008', '\u0087', '\u0018', '\u0019', '\u0092', '\u008F', '\u001C', '\u001D', '\u001E', '\u001F', '\u0080',
70 '\u0081', '\u0082', '\u0083', '\u0084', 0xA, '\u0017', '\u001B', '\u0088', '\u0089', '\u008A', '\u008B',
71 '\u008C', '\u0005', '\u0006', '\u0007', '\u0090', '\u0091', '\u0016', '\u0093', '\u0094', '\u0095', '\u0096',
72 '\u0004', '\u0098', '\u0099', '\u009A', '\u009B', '\u0014', '\u0015', '\u009E', '\u001A', '\u0020', '\u00A0',
73 '\u00E2', '\u007B', '\u00E0', '\u00E1', '\u00E3', '\u00E5', '\u00E7', '\u00F1', '\u00C4', '\u002E', '\u003C',
74 '\u0028', '\u002B', '\u0021', '\u0026', '\u00E9', '\u00EA', '\u00EB', '\u00E8', '\u00ED', '\u00EE', '\u00EF',
75 '\u00EC', '\u007E', '\u00DC', '\u0024', '\u002A', '\u0029', '\u003B', '\u005E', '\u002D', '\u002F', '\u00C2',
76 '\u005B', '\u00C0', '\u00C1', '\u00C3', '\u00C5', '\u00C7', '\u00D1', '\u00F6', '\u002C', '\u0025', '\u005F',
77 '\u003E', '\u003F', '\u00F8', '\u00C9', '\u00CA', '\u00CB', '\u00C8', '\u00CD', '\u00CE', '\u00CF', '\u00CC',
78 '\u0060', '\u003A', '\u0023', '\u00A7', 0x27, '\u003D', '\u0022', '\u00D8', '\u0061', '\u0062', '\u0063',
79 '\u0064', '\u0065', '\u0066', '\u0067', '\u0068', '\u0069', '\u00AB', '\u00BB', '\u00F0', '\u00FD', '\u00FE',
80 '\u00B1', '\u00B0', '\u006A', '\u006B', '\u006C', '\u006D', '\u006E', '\u006F', '\u0070', '\u0071', '\u0072',
81 '\u00AA', '\u00BA', '\u00E6', '\u00B8', '\u00C6', '\u00A4', '\u00B5', '\u00DF', '\u0073', '\u0074', '\u0075',
82 '\u0076', '\u0077', '\u0078', '\u0079', '\u007A', '\u00A1', '\u00BF', '\u00D0', '\u00DD', '\u00DE', '\u00AE',
83 '\u00A2', '\u00A3', '\u00A5', '\u00B7', '\u00A9', '\u0040', '\u00B6', '\u00BC', '\u00BD', '\u00BE', '\u00AC',
84 '\u007C', '\u203E', '\u00A8', '\u00B4', '\u00D7', '\u00E4', '\u0041', '\u0042', '\u0043', '\u0044', '\u0045',
85 '\u0046', '\u0047', '\u0048', '\u0049', '\u00AD', '\u00F4', '\u00A6', '\u00F2', '\u00F3', '\u00F5', '\u00FC',
86 '\u004A', '\u004B', '\u004C', '\u004D', '\u004E', '\u004F', '\u0050', '\u0051', '\u0052', '\u00B9', '\u00FB',
87 '\u007D', '\u00F9', '\u00FA', '\u00FF', '\u00D6', '\u00F7', '\u0053', '\u0054', '\u0055', '\u0056', '\u0057',
88 '\u0058', '\u0059', '\u005A', '\u00B2', '\u00D4', 0x5C, '\u00D2', '\u00D3', '\u00D5', '\u0030', '\u0031',
89 '\u0032', '\u0033', '\u0034', '\u0035', '\u0036', '\u0037', '\u0038', '\u0039', '\u00B3', '\u00DB', '\u005D',
90 '\u00D9', '\u00DA', '\u009F'
91 };
92
93 static final byte[] CHAR_TO_BYTE = new byte[ 0x203F ];
94
95 static
96 {
97 CHAR_TO_BYTE['\u0000'] = (byte) 0x00;
98 CHAR_TO_BYTE['\u0001'] = (byte) 0x01;
99 CHAR_TO_BYTE['\u0002'] = (byte) 0x02;
100 CHAR_TO_BYTE['\u0003'] = (byte) 0x03;
101 CHAR_TO_BYTE['\u009C'] = (byte) 0x04;
102 CHAR_TO_BYTE['\u0009'] = (byte) 0x05;
103 CHAR_TO_BYTE['\u0086'] = (byte) 0x06;
104 CHAR_TO_BYTE['\u007F'] = (byte) 0x07;
105 CHAR_TO_BYTE['\u0097'] = (byte) 0x08;
106 CHAR_TO_BYTE['\u008D'] = (byte) 0x09;
107 CHAR_TO_BYTE['\u008E'] = (byte) 0x0A;
108 CHAR_TO_BYTE['\u000B'] = (byte) 0x0B;
109 CHAR_TO_BYTE['\u000C'] = (byte) 0x0C;
110 CHAR_TO_BYTE[0xD] = (byte) 0x0D;
111 CHAR_TO_BYTE['\u000E'] = (byte) 0x0E;
112 CHAR_TO_BYTE['\u000F'] = (byte) 0x0F;
113 CHAR_TO_BYTE['\u0010'] = (byte) 0x10;
114 CHAR_TO_BYTE['\u0011'] = (byte) 0x11;
115 CHAR_TO_BYTE['\u0012'] = (byte) 0x12;
116 CHAR_TO_BYTE['\u0013'] = (byte) 0x13;
117 CHAR_TO_BYTE['\u009D'] = (byte) 0x14;
118 CHAR_TO_BYTE['\u0085'] = (byte) 0x15;
119 CHAR_TO_BYTE['\u0008'] = (byte) 0x16;
120 CHAR_TO_BYTE['\u0087'] = (byte) 0x17;
121 CHAR_TO_BYTE['\u0018'] = (byte) 0x18;
122 CHAR_TO_BYTE['\u0019'] = (byte) 0x19;
123 CHAR_TO_BYTE['\u0092'] = (byte) 0x1A;
124 CHAR_TO_BYTE['\u008F'] = (byte) 0x1B;
125 CHAR_TO_BYTE['\u001C'] = (byte) 0x1C;
126 CHAR_TO_BYTE['\u001D'] = (byte) 0x1D;
127 CHAR_TO_BYTE['\u001E'] = (byte) 0x1E;
128 CHAR_TO_BYTE['\u001F'] = (byte) 0x1F;
129 CHAR_TO_BYTE['\u0080'] = (byte) 0x20;
130 CHAR_TO_BYTE['\u0081'] = (byte) 0x21;
131 CHAR_TO_BYTE['\u0082'] = (byte) 0x22;
132 CHAR_TO_BYTE['\u0083'] = (byte) 0x23;
133 CHAR_TO_BYTE['\u0084'] = (byte) 0x24;
134 CHAR_TO_BYTE[0xA] = (byte) 0x25;
135 CHAR_TO_BYTE['\u0017'] = (byte) 0x26;
136 CHAR_TO_BYTE['\u001B'] = (byte) 0x27;
137 CHAR_TO_BYTE['\u0088'] = (byte) 0x28;
138 CHAR_TO_BYTE['\u0089'] = (byte) 0x29;
139 CHAR_TO_BYTE['\u008A'] = (byte) 0x2A;
140 CHAR_TO_BYTE['\u008B'] = (byte) 0x2B;
141 CHAR_TO_BYTE['\u008C'] = (byte) 0x2C;
142 CHAR_TO_BYTE['\u0005'] = (byte) 0x2D;
143 CHAR_TO_BYTE['\u0006'] = (byte) 0x2E;
144 CHAR_TO_BYTE['\u0007'] = (byte) 0x2F;
145 CHAR_TO_BYTE['\u0090'] = (byte) 0x30;
146 CHAR_TO_BYTE['\u0091'] = (byte) 0x31;
147 CHAR_TO_BYTE['\u0016'] = (byte) 0x32;
148 CHAR_TO_BYTE['\u0093'] = (byte) 0x33;
149 CHAR_TO_BYTE['\u0094'] = (byte) 0x34;
150 CHAR_TO_BYTE['\u0095'] = (byte) 0x35;
151 CHAR_TO_BYTE['\u0096'] = (byte) 0x36;
152 CHAR_TO_BYTE['\u0004'] = (byte) 0x37;
153 CHAR_TO_BYTE['\u0098'] = (byte) 0x38;
154 CHAR_TO_BYTE['\u0099'] = (byte) 0x39;
155 CHAR_TO_BYTE['\u009A'] = (byte) 0x3A;
156 CHAR_TO_BYTE['\u009B'] = (byte) 0x3B;
157 CHAR_TO_BYTE['\u0014'] = (byte) 0x3C;
158 CHAR_TO_BYTE['\u0015'] = (byte) 0x3D;
159 CHAR_TO_BYTE['\u009E'] = (byte) 0x3E;
160 CHAR_TO_BYTE['\u001A'] = (byte) 0x3F;
161 CHAR_TO_BYTE['\u0020'] = (byte) 0x40;
162 CHAR_TO_BYTE['\u00A0'] = (byte) 0x41;
163 CHAR_TO_BYTE['\u00E2'] = (byte) 0x42;
164 CHAR_TO_BYTE['\u007B'] = (byte) 0x43;
165 CHAR_TO_BYTE['\u00E0'] = (byte) 0x44;
166 CHAR_TO_BYTE['\u00E1'] = (byte) 0x45;
167 CHAR_TO_BYTE['\u00E3'] = (byte) 0x46;
168 CHAR_TO_BYTE['\u00E5'] = (byte) 0x47;
169 CHAR_TO_BYTE['\u00E7'] = (byte) 0x48;
170 CHAR_TO_BYTE['\u00F1'] = (byte) 0x49;
171 CHAR_TO_BYTE['\u00C4'] = (byte) 0x4A;
172 CHAR_TO_BYTE['\u002E'] = (byte) 0x4B;
173 CHAR_TO_BYTE['\u003C'] = (byte) 0x4C;
174 CHAR_TO_BYTE['\u0028'] = (byte) 0x4D;
175 CHAR_TO_BYTE['\u002B'] = (byte) 0x4E;
176 CHAR_TO_BYTE['\u0021'] = (byte) 0x4F;
177 CHAR_TO_BYTE['\u0026'] = (byte) 0x50;
178 CHAR_TO_BYTE['\u00E9'] = (byte) 0x51;
179 CHAR_TO_BYTE['\u00EA'] = (byte) 0x52;
180 CHAR_TO_BYTE['\u00EB'] = (byte) 0x53;
181 CHAR_TO_BYTE['\u00E8'] = (byte) 0x54;
182 CHAR_TO_BYTE['\u00ED'] = (byte) 0x55;
183 CHAR_TO_BYTE['\u00EE'] = (byte) 0x56;
184 CHAR_TO_BYTE['\u00EF'] = (byte) 0x57;
185 CHAR_TO_BYTE['\u00EC'] = (byte) 0x58;
186 CHAR_TO_BYTE['\u007E'] = (byte) 0x59;
187 CHAR_TO_BYTE['\u00DC'] = (byte) 0x5A;
188 CHAR_TO_BYTE['\u0024'] = (byte) 0x5B;
189 CHAR_TO_BYTE['\u002A'] = (byte) 0x5C;
190 CHAR_TO_BYTE['\u0029'] = (byte) 0x5D;
191 CHAR_TO_BYTE['\u003B'] = (byte) 0x5E;
192 CHAR_TO_BYTE['\u005E'] = (byte) 0x5F;
193 CHAR_TO_BYTE['\u002D'] = (byte) 0x60;
194 CHAR_TO_BYTE['\u002F'] = (byte) 0x61;
195 CHAR_TO_BYTE['\u00C2'] = (byte) 0x62;
196 CHAR_TO_BYTE['\u005B'] = (byte) 0x63;
197 CHAR_TO_BYTE['\u00C0'] = (byte) 0x64;
198 CHAR_TO_BYTE['\u00C1'] = (byte) 0x65;
199 CHAR_TO_BYTE['\u00C3'] = (byte) 0x66;
200 CHAR_TO_BYTE['\u00C5'] = (byte) 0x67;
201 CHAR_TO_BYTE['\u00C7'] = (byte) 0x68;
202 CHAR_TO_BYTE['\u00D1'] = (byte) 0x69;
203 CHAR_TO_BYTE['\u00F6'] = (byte) 0x6A;
204 CHAR_TO_BYTE['\u002C'] = (byte) 0x6B;
205 CHAR_TO_BYTE['\u0025'] = (byte) 0x6C;
206 CHAR_TO_BYTE['\u005F'] = (byte) 0x6D;
207 CHAR_TO_BYTE['\u003E'] = (byte) 0x6E;
208 CHAR_TO_BYTE['\u003F'] = (byte) 0x6F;
209 CHAR_TO_BYTE['\u00F8'] = (byte) 0x70;
210 CHAR_TO_BYTE['\u00C9'] = (byte) 0x71;
211 CHAR_TO_BYTE['\u00CA'] = (byte) 0x72;
212 CHAR_TO_BYTE['\u00CB'] = (byte) 0x73;
213 CHAR_TO_BYTE['\u00C8'] = (byte) 0x74;
214 CHAR_TO_BYTE['\u00CD'] = (byte) 0x75;
215 CHAR_TO_BYTE['\u00CE'] = (byte) 0x76;
216 CHAR_TO_BYTE['\u00CF'] = (byte) 0x77;
217 CHAR_TO_BYTE['\u00CC'] = (byte) 0x78;
218 CHAR_TO_BYTE['\u0060'] = (byte) 0x79;
219 CHAR_TO_BYTE['\u003A'] = (byte) 0x7A;
220 CHAR_TO_BYTE['\u0023'] = (byte) 0x7B;
221 CHAR_TO_BYTE['\u00A7'] = (byte) 0x7C;
222 CHAR_TO_BYTE[0x27] = (byte) 0x7D;
223 CHAR_TO_BYTE['\u003D'] = (byte) 0x7E;
224 CHAR_TO_BYTE['\u0022'] = (byte) 0x7F;
225 CHAR_TO_BYTE['\u00D8'] = (byte) 0x80;
226 CHAR_TO_BYTE['\u0061'] = (byte) 0x81;
227 CHAR_TO_BYTE['\u0062'] = (byte) 0x82;
228 CHAR_TO_BYTE['\u0063'] = (byte) 0x83;
229 CHAR_TO_BYTE['\u0064'] = (byte) 0x84;
230 CHAR_TO_BYTE['\u0065'] = (byte) 0x85;
231 CHAR_TO_BYTE['\u0066'] = (byte) 0x86;
232 CHAR_TO_BYTE['\u0067'] = (byte) 0x87;
233 CHAR_TO_BYTE['\u0068'] = (byte) 0x88;
234 CHAR_TO_BYTE['\u0069'] = (byte) 0x89;
235 CHAR_TO_BYTE['\u00AB'] = (byte) 0x8A;
236 CHAR_TO_BYTE['\u00BB'] = (byte) 0x8B;
237 CHAR_TO_BYTE['\u00F0'] = (byte) 0x8C;
238 CHAR_TO_BYTE['\u00FD'] = (byte) 0x8D;
239 CHAR_TO_BYTE['\u00FE'] = (byte) 0x8E;
240 CHAR_TO_BYTE['\u00B1'] = (byte) 0x8F;
241 CHAR_TO_BYTE['\u00B0'] = (byte) 0x90;
242 CHAR_TO_BYTE['\u006A'] = (byte) 0x91;
243 CHAR_TO_BYTE['\u006B'] = (byte) 0x92;
244 CHAR_TO_BYTE['\u006C'] = (byte) 0x93;
245 CHAR_TO_BYTE['\u006D'] = (byte) 0x94;
246 CHAR_TO_BYTE['\u006E'] = (byte) 0x95;
247 CHAR_TO_BYTE['\u006F'] = (byte) 0x96;
248 CHAR_TO_BYTE['\u0070'] = (byte) 0x97;
249 CHAR_TO_BYTE['\u0071'] = (byte) 0x98;
250 CHAR_TO_BYTE['\u0072'] = (byte) 0x99;
251 CHAR_TO_BYTE['\u00AA'] = (byte) 0x9A;
252 CHAR_TO_BYTE['\u00BA'] = (byte) 0x9B;
253 CHAR_TO_BYTE['\u00E6'] = (byte) 0x9C;
254 CHAR_TO_BYTE['\u00B8'] = (byte) 0x9D;
255 CHAR_TO_BYTE['\u00C6'] = (byte) 0x9E;
256 CHAR_TO_BYTE['\u00A4'] = (byte) 0x9F;
257 CHAR_TO_BYTE['\u00B5'] = (byte) 0xA0;
258 CHAR_TO_BYTE['\u00DF'] = (byte) 0xA1;
259 CHAR_TO_BYTE['\u0073'] = (byte) 0xA2;
260 CHAR_TO_BYTE['\u0074'] = (byte) 0xA3;
261 CHAR_TO_BYTE['\u0075'] = (byte) 0xA4;
262 CHAR_TO_BYTE['\u0076'] = (byte) 0xA5;
263 CHAR_TO_BYTE['\u0077'] = (byte) 0xA6;
264 CHAR_TO_BYTE['\u0078'] = (byte) 0xA7;
265 CHAR_TO_BYTE['\u0079'] = (byte) 0xA8;
266 CHAR_TO_BYTE['\u007A'] = (byte) 0xA9;
267 CHAR_TO_BYTE['\u00A1'] = (byte) 0xAA;
268 CHAR_TO_BYTE['\u00BF'] = (byte) 0xAB;
269 CHAR_TO_BYTE['\u00D0'] = (byte) 0xAC;
270 CHAR_TO_BYTE['\u00DD'] = (byte) 0xAD;
271 CHAR_TO_BYTE['\u00DE'] = (byte) 0xAE;
272 CHAR_TO_BYTE['\u00AE'] = (byte) 0xAF;
273 CHAR_TO_BYTE['\u00A2'] = (byte) 0xB0;
274 CHAR_TO_BYTE['\u00A3'] = (byte) 0xB1;
275 CHAR_TO_BYTE['\u00A5'] = (byte) 0xB2;
276 CHAR_TO_BYTE['\u00B7'] = (byte) 0xB3;
277 CHAR_TO_BYTE['\u00A9'] = (byte) 0xB4;
278 CHAR_TO_BYTE['\u0040'] = (byte) 0xB5;
279 CHAR_TO_BYTE['\u00B6'] = (byte) 0xB6;
280 CHAR_TO_BYTE['\u00BC'] = (byte) 0xB7;
281 CHAR_TO_BYTE['\u00BD'] = (byte) 0xB8;
282 CHAR_TO_BYTE['\u00BE'] = (byte) 0xB9;
283 CHAR_TO_BYTE['\u00AC'] = (byte) 0xBA;
284 CHAR_TO_BYTE['\u007C'] = (byte) 0xBB;
285 CHAR_TO_BYTE['\u203E'] = (byte) 0xBC;
286 CHAR_TO_BYTE['\u00A8'] = (byte) 0xBD;
287 CHAR_TO_BYTE['\u00B4'] = (byte) 0xBE;
288 CHAR_TO_BYTE['\u00D7'] = (byte) 0xBF;
289 CHAR_TO_BYTE['\u00E4'] = (byte) 0xC0;
290 CHAR_TO_BYTE['\u0041'] = (byte) 0xC1;
291 CHAR_TO_BYTE['\u0042'] = (byte) 0xC2;
292 CHAR_TO_BYTE['\u0043'] = (byte) 0xC3;
293 CHAR_TO_BYTE['\u0044'] = (byte) 0xC4;
294 CHAR_TO_BYTE['\u0045'] = (byte) 0xC5;
295 CHAR_TO_BYTE['\u0046'] = (byte) 0xC6;
296 CHAR_TO_BYTE['\u0047'] = (byte) 0xC7;
297 CHAR_TO_BYTE['\u0048'] = (byte) 0xC8;
298 CHAR_TO_BYTE['\u0049'] = (byte) 0xC9;
299 CHAR_TO_BYTE['\u00AD'] = (byte) 0xCA;
300 CHAR_TO_BYTE['\u00F4'] = (byte) 0xCB;
301 CHAR_TO_BYTE['\u00A6'] = (byte) 0xCC;
302 CHAR_TO_BYTE['\u00F2'] = (byte) 0xCD;
303 CHAR_TO_BYTE['\u00F3'] = (byte) 0xCE;
304 CHAR_TO_BYTE['\u00F5'] = (byte) 0xCF;
305 CHAR_TO_BYTE['\u00FC'] = (byte) 0xD0;
306 CHAR_TO_BYTE['\u004A'] = (byte) 0xD1;
307 CHAR_TO_BYTE['\u004B'] = (byte) 0xD2;
308 CHAR_TO_BYTE['\u004C'] = (byte) 0xD3;
309 CHAR_TO_BYTE['\u004D'] = (byte) 0xD4;
310 CHAR_TO_BYTE['\u004E'] = (byte) 0xD5;
311 CHAR_TO_BYTE['\u004F'] = (byte) 0xD6;
312 CHAR_TO_BYTE['\u0050'] = (byte) 0xD7;
313 CHAR_TO_BYTE['\u0051'] = (byte) 0xD8;
314 CHAR_TO_BYTE['\u0052'] = (byte) 0xD9;
315 CHAR_TO_BYTE['\u00B9'] = (byte) 0xDA;
316 CHAR_TO_BYTE['\u00FB'] = (byte) 0xDB;
317 CHAR_TO_BYTE['\u007D'] = (byte) 0xDC;
318 CHAR_TO_BYTE['\u00F9'] = (byte) 0xDD;
319 CHAR_TO_BYTE['\u00FA'] = (byte) 0xDE;
320 CHAR_TO_BYTE['\u00FF'] = (byte) 0xDF;
321 CHAR_TO_BYTE['\u00D6'] = (byte) 0xE0;
322 CHAR_TO_BYTE['\u00F7'] = (byte) 0xE1;
323 CHAR_TO_BYTE['\u0053'] = (byte) 0xE2;
324 CHAR_TO_BYTE['\u0054'] = (byte) 0xE3;
325 CHAR_TO_BYTE['\u0055'] = (byte) 0xE4;
326 CHAR_TO_BYTE['\u0056'] = (byte) 0xE5;
327 CHAR_TO_BYTE['\u0057'] = (byte) 0xE6;
328 CHAR_TO_BYTE['\u0058'] = (byte) 0xE7;
329 CHAR_TO_BYTE['\u0059'] = (byte) 0xE8;
330 CHAR_TO_BYTE['\u005A'] = (byte) 0xE9;
331 CHAR_TO_BYTE['\u00B2'] = (byte) 0xEA;
332 CHAR_TO_BYTE['\u00D4'] = (byte) 0xEB;
333 CHAR_TO_BYTE[0x5C] = (byte) 0xEC;
334 CHAR_TO_BYTE['\u00D2'] = (byte) 0xED;
335 CHAR_TO_BYTE['\u00D3'] = (byte) 0xEE;
336 CHAR_TO_BYTE['\u00D5'] = (byte) 0xEF;
337 CHAR_TO_BYTE['\u0030'] = (byte) 0xF0;
338 CHAR_TO_BYTE['\u0031'] = (byte) 0xF1;
339 CHAR_TO_BYTE['\u0032'] = (byte) 0xF2;
340 CHAR_TO_BYTE['\u0033'] = (byte) 0xF3;
341 CHAR_TO_BYTE['\u0034'] = (byte) 0xF4;
342 CHAR_TO_BYTE['\u0035'] = (byte) 0xF5;
343 CHAR_TO_BYTE['\u0036'] = (byte) 0xF6;
344 CHAR_TO_BYTE['\u0037'] = (byte) 0xF7;
345 CHAR_TO_BYTE['\u0038'] = (byte) 0xF8;
346 CHAR_TO_BYTE['\u0039'] = (byte) 0xF9;
347 CHAR_TO_BYTE['\u00B3'] = (byte) 0xFA;
348 CHAR_TO_BYTE['\u00DB'] = (byte) 0xFB;
349 CHAR_TO_BYTE['\u005D'] = (byte) 0xFC;
350 CHAR_TO_BYTE['\u00D9'] = (byte) 0xFD;
351 CHAR_TO_BYTE['\u00DA'] = (byte) 0xFE;
352 CHAR_TO_BYTE['\u009F'] = (byte) 0xFF;
353 }
354
355
356 public IBM273CharsetProvider()
357 {
358 super();
359 }
360
361 public Charset charsetForName( final String charsetName )
362 {
363 Charset ret = null;
364
365 if ( charsetName != null )
366 {
367 final String lower = charsetName.toLowerCase();
368 for ( int i = 0; i < SUPPORTED_NAMES.length; i++ )
369 {
370 if ( SUPPORTED_NAMES[i].equals( lower ) )
371 {
372 ret = new IBM273Charset();
373 break;
374 }
375 }
376 }
377
378 return ret;
379 }
380
381 public Iterator charsets()
382 {
383 return new Iterator()
384 {
385
386 private boolean hasNext = true;
387
388 public boolean hasNext()
389 {
390 return this.hasNext;
391 }
392
393 public Object next()
394 {
395 if ( this.hasNext )
396 {
397 this.hasNext = false;
398 return new IBM273Charset();
399 }
400 else
401 {
402 throw new NoSuchElementException();
403 }
404
405 }
406
407 public void remove()
408 {
409 throw new UnsupportedOperationException();
410 }
411
412 };
413 }
414
415 }
416
417
418 class IBM273Charset extends Charset
419 {
420
421 public IBM273Charset()
422 {
423 super( IBM273CharsetProvider.COMMON_NAME, IBM273CharsetProvider.ALIAS_NAMES );
424 }
425
426 public CharsetEncoder newEncoder()
427 {
428 return new IBM273CharsetEncoder( this );
429 }
430
431 public CharsetDecoder newDecoder()
432 {
433 return new IBM273CharsetDecoder( this );
434 }
435
436 public boolean contains( final Charset charset )
437 {
438 return false;
439 }
440
441 static boolean isCharacterSupported( final char c )
442 {
443 return ( c >= '\u0000' && c <= '\u00AE' ) || ( c >= '\u00B0' && c <= '\u00FF' ) || c == '\u203E';
444 }
445
446 }
447
448 class IBM273CharsetEncoder extends CharsetEncoder
449 {
450
451 private final char[] charBuf = new char[ 65536 ];
452
453 IBM273CharsetEncoder( final Charset charset )
454 {
455 super( charset, 1f, 1f );
456 this.onUnmappableCharacter( CodingErrorAction.REPLACE );
457 }
458
459 protected CoderResult encodeLoop( final CharBuffer in, final ByteBuffer buf )
460 {
461 if ( in.hasArray() && buf.hasArray() )
462 {
463 return encodeLoopArray( in, buf );
464 }
465
466 while ( in.hasRemaining() )
467 {
468 in.mark();
469
470 final int len;
471 if ( in.remaining() < this.charBuf.length )
472 {
473 len = in.remaining();
474 in.get( this.charBuf, 0, in.remaining() );
475 }
476 else
477 {
478 in.get( this.charBuf, 0, this.charBuf.length );
479 len = this.charBuf.length;
480 }
481
482 for ( int i = 0; i < len; i++ )
483 {
484 if ( !buf.hasRemaining() )
485 {
486 in.reset();
487 in.position( in.position() + i );
488 return CoderResult.OVERFLOW;
489 }
490
491 if ( !IBM273Charset.isCharacterSupported( this.charBuf[i] ) )
492 {
493 in.reset();
494 in.position( in.position() + i );
495 return CoderResult.unmappableForLength( 1 );
496 }
497
498 buf.put( IBM273CharsetProvider.CHAR_TO_BYTE[this.charBuf[i]] );
499 }
500 }
501
502 return CoderResult.UNDERFLOW;
503 }
504
505 private static CoderResult encodeLoopArray( final CharBuffer in, final ByteBuffer buf )
506 {
507 final int len = in.remaining();
508 for ( int i = 0; i < len; i++, in.position( in.position() + 1 ), buf.position( buf.position() + 1 ) )
509 {
510 if ( !buf.hasRemaining() )
511 {
512 return CoderResult.OVERFLOW;
513 }
514
515 if ( !IBM273Charset.isCharacterSupported( in.array()[in.position() + in.arrayOffset()] ) )
516 {
517 return CoderResult.unmappableForLength( 1 );
518 }
519
520 buf.array()[buf.position() + buf.arrayOffset()] =
521 IBM273CharsetProvider.CHAR_TO_BYTE[in.array()[in.position() + in.arrayOffset()]];
522
523 }
524
525 return CoderResult.UNDERFLOW;
526 }
527
528 }
529
530 class IBM273CharsetDecoder extends CharsetDecoder
531 {
532
533 private final byte[] byteBuf = new byte[ 65536 ];
534
535 IBM273CharsetDecoder( final Charset charset )
536 {
537 super( charset, 1f, 1f );
538 this.onUnmappableCharacter( CodingErrorAction.REPLACE );
539 }
540
541 protected CoderResult decodeLoop( final ByteBuffer in, final CharBuffer buf )
542 {
543 if ( in.hasArray() && buf.hasArray() )
544 {
545 return decodeLoopArray( in, buf );
546 }
547
548 while ( in.hasRemaining() )
549 {
550 in.mark();
551
552 final int len;
553 if ( in.remaining() < this.byteBuf.length )
554 {
555 len = in.remaining();
556 in.get( this.byteBuf, 0, in.remaining() );
557 }
558 else
559 {
560 in.get( this.byteBuf, 0, this.byteBuf.length );
561 len = this.byteBuf.length;
562 }
563
564 for ( int i = 0; i < len; i++ )
565 {
566 if ( !buf.hasRemaining() )
567 {
568 in.reset();
569 in.position( in.position() + i );
570 return CoderResult.OVERFLOW;
571 }
572
573 buf.put( IBM273CharsetProvider.BYTE_TO_CHAR[this.byteBuf[i] & 0xFF] );
574 }
575 }
576
577 return CoderResult.UNDERFLOW;
578 }
579
580 private static CoderResult decodeLoopArray( final ByteBuffer in, final CharBuffer buf )
581 {
582 final int len = in.remaining();
583 for ( int i = 0; i < len; i++, in.position( in.position() + 1 ), buf.position( buf.position() + 1 ) )
584 {
585 if ( !buf.hasRemaining() )
586 {
587 return CoderResult.OVERFLOW;
588 }
589
590 buf.array()[buf.position() + buf.arrayOffset()] =
591 IBM273CharsetProvider.BYTE_TO_CHAR[in.array()[in.position() + in.arrayOffset()] & 0xFF];
592
593 }
594
595 return CoderResult.UNDERFLOW;
596 }
597
598 }