View Javadoc
1   /*
2    *  jDTAUS Banking Charset Providers
3    *  Copyright (C) 2005 Christian Schulte
4    *  <cs@schulte.it>
5    *
6    *  This library is free software; you can redistribute it and/or
7    *  modify it under the terms of the GNU Lesser General Public
8    *  License as published by the Free Software Foundation; either
9    *  version 2.1 of the License, or any later version.
10   *
11   *  This library is distributed in the hope that it will be useful,
12   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   *  Lesser General Public License for more details.
15   *
16   *  You should have received a copy of the GNU Lesser General Public
17   *  License along with this library; if not, write to the Free Software
18   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
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   * {@code CharsetProvider} for IBM273 Charset.
36   * <p>
37   * Name: IBM273<br>
38   * MIBenum: 2030<br>
39   * Source: IBM NLS RM Vol2 SE09-8002-01, March 1990<br>
40   * Alias: CP273<br>
41   * Alias: csIBM273<br>
42   * See: RFC1345,KXS2<br>
43   *
44   * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
45   * @version $JDTAUS: IBM273CharsetProvider.java 8661 2012-09-27 11:29:58Z schulte $
46   */
47  public class IBM273CharsetProvider extends CharsetProvider
48  {
49  
50      /** Common name. */
51      static final String COMMON_NAME = "IBM273";
52  
53      /** Alias names. */
54      static final String[] ALIAS_NAMES =
55      {
56          "cp273", "csIBM273"
57      };
58  
59      /** Supported character set names. */
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     /** Creates a new {@code IBM273CharsetProvider} instance. */
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 /** IBM273 {@code Charset} implementation. */
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 }