1   /****************************************************************************
2    **
3    ** This file is part of yFiles-2.9. 
4    ** 
5    ** yWorks proprietary/confidential. Use is subject to license terms.
6    **
7    ** Redistribution of this file or of an unauthorized byte-code version
8    ** of this file is strictly forbidden.
9    **
10   ** Copyright (c) 2000-2011 by yWorks GmbH, Vor dem Kreuzberg 28, 
11   ** 72070 Tuebingen, Germany. All rights reserved.
12   **
13   ***************************************************************************/
14  package demo.layout.genealogy.iohandler;
15  
16  import java.io.OutputStreamWriter;
17  import java.io.OutputStream;
18  import java.io.IOException;
19  
20  public class AnselOutputStreamWriter extends OutputStreamWriter {
21      private OutputStream output;
22  
23      public AnselOutputStreamWriter(OutputStream out)
24      throws IOException {
25          super(out);
26          output = out;
27      }
28  
29      /*
30      * Write one UNICODE character
31      */
32  
33      public void write(int c) throws IOException
34      {
35  
36          int ansel;
37          if (c<128) output.write(c);
38          else {
39            ansel = convert(c);
40            if (ansel < 256) {
41              output.write(ansel);
42            } else {
43              output.write(ansel / 256);
44              output.write(ansel % 256);
45            }
46          }
47      }
48  
49      /*
50      * Write part of an array of UNICODE characters
51      */
52  
53      public void write(char[] cbuf, int off, int len)
54                       throws IOException
55      {
56          for (int i=off; i<off+len; i++) {
57              write(cbuf[i]);
58          }
59      }
60  
61      /*
62      * Write a string of UNICODE characters
63      */
64  
65      public void write(String s)
66                       throws IOException
67      {
68          for (int i=0; i<s.length(); i++) {
69              write((int)s.charAt(i));
70          }
71      }
72  
73      /*
74      * Determine the character code in use
75      */
76  
77      public String getEncoding() {
78          return "ANSEL";
79      }
80  
81      /*
82      * Conversion table for UNICODE to Ansel
83      */
84  
85      private int convert( int unicode )
86      {
87        switch(unicode) {
88  
89          case 0x00A1: return 0xC6;  //  inverted exclamation mark
90          case 0x00A3: return 0xB9;  //  pound sign
91          case 0x00A9: return 0xC3;  //  copyright sign
92          case 0x00AE: return 0xAA;  //  registered trade mark sign
93          case 0x00B0: return 0xC0;  //  degree sign, ring above
94          case 0x00B1: return 0xAB;  //  plus-minus sign
95          case 0x00B7: return 0xA8;  //  middle dot
96          case 0x00B8: return 0xF020;  //  cedilla
97          case 0x00BF: return 0xC5;  //  inverted question mark
98          case 0x00C0: return 0xE141;  //  capital A with grave accent
99          case 0x00C1: return 0xE241;  //  capital A with acute accent
100         case 0x00C2: return 0xE341;  //  capital A with circumflex accent
101         case 0x00C3: return 0xE441;  //  capital A with tilde
102         case 0x00C4: return 0xE841;  //  capital A with diaeresis
103         case 0x00C5: return 0xEA41;  //  capital A with ring above
104         case 0x00C6: return 0xA5;  //  capital diphthong A with E
105         case 0x00C7: return 0xF043;  //  capital C with cedilla
106         case 0x00C8: return 0xE145;  //  capital E with grave accent
107         case 0x00C9: return 0xE245;  //  capital E with acute accent
108         case 0x00CA: return 0xE345;  //  capital E with circumflex accent
109         case 0x00CB: return 0xE845;  //  capital E with diaeresis
110         case 0x00CC: return 0xE149;  //  capital I with grave accent
111         case 0x00CD: return 0xE249;  //  capital I with acute accent
112         case 0x00CE: return 0xE349;  //  capital I with circumflex accent
113         case 0x00CF: return 0xE849;  //  capital I with diaeresis
114         case 0x00D0: return 0xA3;  //  capital icelandic letter Eth
115         case 0x00D1: return 0xE44E;  //  capital N with tilde
116         case 0x00D2: return 0xE14F;  //  capital O with grave accent
117         case 0x00D3: return 0xE24F;  //  capital O with acute accent
118         case 0x00D4: return 0xE34F;  //  capital O with circumflex accent
119         case 0x00D5: return 0xE44F;  //  capital O with tilde
120         case 0x00D6: return 0xE84F;  //  capital O with diaeresis
121         case 0x00D8: return 0xA2;  //  capital O with oblique stroke
122         case 0x00D9: return 0xE155;  //  capital U with grave accent
123         case 0x00DA: return 0xE255;  //  capital U with acute accent
124         case 0x00DB: return 0xE355;  //  capital U with circumflex
125         case 0x00DC: return 0xE855;  //  capital U with diaeresis
126         case 0x00DD: return 0xE259;  //  capital Y with acute accent
127         case 0x00DE: return 0xA4;  //  capital Icelandic letter Thorn
128         case 0x00DF: return 0xCF;  //  small German letter sharp s
129         case 0x00E0: return 0xE161;  //  small a with grave accent
130         case 0x00E1: return 0xE261;  //  small a with acute accent
131         case 0x00E2: return 0xE361;  //  small a with circumflex accent
132         case 0x00E3: return 0xE461;  //  small a with tilde
133         case 0x00E4: return 0xE861;  //  small a with diaeresis
134         case 0x00E5: return 0xEA61;  //  small a with ring above
135         case 0x00E6: return 0xB5;  //  small diphthong a with e
136         case 0x00E7: return 0xF063;  //  small c with cedilla
137         case 0x00E8: return 0xE165;  //  small e with grave accent
138         case 0x00E9: return 0xE265;  //  small e with acute accent
139         case 0x00EA: return 0xE365;  //  small e with circumflex accent
140         case 0x00EB: return 0xE865;  //  small e with diaeresis
141         case 0x00EC: return 0xE169;  //  small i with grave accent
142         case 0x00ED: return 0xE269;  //  small i with acute accent
143         case 0x00EE: return 0xE369;  //  small i with circumflex accent
144         case 0x00EF: return 0xE869;  //  small i with diaeresis
145         case 0x00F0: return 0xBA;  //  small Icelandic letter Eth
146         case 0x00F1: return 0xE46E;  //  small n with tilde
147         case 0x00F2: return 0xE16F;  //  small o with grave accent
148         case 0x00F3: return 0xE26F;  //  small o with acute accent
149         case 0x00F4: return 0xE36F;  //  small o with circumflex accent
150         case 0x00F5: return 0xE46F;  //  small o with tilde
151         case 0x00F6: return 0xE86F;  //  small o with diaeresis
152         case 0x00F8: return 0xB2;  //  small o with oblique stroke
153         case 0x00F9: return 0xE175;  //  small u with grave accent
154         case 0x00FA: return 0xE275;  //  small u with acute accent
155         case 0x00FB: return 0xE375;  //  small u with circumflex
156         case 0x00FC: return 0xE875;  //  small u with diaeresis
157         case 0x00FD: return 0xE279;  //  small y with acute accent
158         case 0x00FE: return 0xB4;  //  small Icelandic letter Thorn
159         case 0x00FF: return 0xE879;  //  small y with diaeresis
160         case 0x0100: return 0xE541;  //  capital a with macron
161         case 0x0101: return 0xE561;  //  small a with macron
162         case 0x0102: return 0xE641;  //  capital A with breve
163         case 0x0103: return 0xE661;  //  small a with breve
164         case 0x0104: return 0xF141;  //  capital A with ogonek
165         case 0x0105: return 0xF161;  //  small a with ogonek
166         case 0x0106: return 0xE243;  //  capital C with acute accent
167         case 0x0107: return 0xE263;  //  small c with acute accent
168         case 0x0108: return 0xE343;  //  capital c with circumflex
169         case 0x0109: return 0xE363;  //  small c with circumflex
170         case 0x010A: return 0xE743;  //  capital c with dot above
171         case 0x010B: return 0xE763;  //  small c with dot above
172         case 0x010C: return 0xE943;  //  capital C with caron
173         case 0x010D: return 0xE963;  //  small c with caron
174         case 0x010E: return 0xE944;  //  capital D with caron
175         case 0x010F: return 0xE964;  //  small d with caron
176         case 0x0110: return 0xA3;  //  capital D with stroke
177         case 0x0111: return 0xB3;  //  small D with stroke
178         case 0x0112: return 0xE545;  //  capital e with macron
179         case 0x0113: return 0xE565;  //  small e with macron
180         case 0x0114: return 0xE645;  //  capital e with breve
181         case 0x0115: return 0xE665;  //  small e with breve
182         case 0x0116: return 0xE745;  //  capital e with dot above
183         case 0x0117: return 0xE765;  //  small e with dot above
184         case 0x0118: return 0xF145;  //  capital E with ogonek
185         case 0x0119: return 0xF165;  //  small e with ogonek
186         case 0x011A: return 0xE945;  //  capital E with caron
187         case 0x011B: return 0xE965;  //  small e with caron
188         case 0x011C: return 0xE347;  //  capital g with circumflex
189         case 0x011D: return 0xE367;  //  small g with circumflex
190         case 0x011E: return 0xE647;  //  capital g with breve
191         case 0x011F: return 0xE667;  //  small g with breve
192         case 0x0120: return 0xE747;  //  capital g with dot above
193         case 0x0121: return 0xE767;  //  small g with dot above
194         case 0x0122: return 0xF047;  //  capital g with cedilla
195         case 0x0123: return 0xF067;  //  small g with cedilla
196         case 0x0124: return 0xE348;  //  capital h with circumflex
197         case 0x0125: return 0xE368;  //  small h with circumflex
198         case 0x0128: return 0xE449;  //  capital i with tilde
199         case 0x0129: return 0xE469;  //  small i with tilde
200         case 0x012A: return 0xE549;  //  capital i with macron
201         case 0x012B: return 0xE569;  //  small i with macron
202         case 0x012C: return 0xE649;  //  capital i with breve
203         case 0x012D: return 0xE669;  //  small i with breve
204         case 0x012E: return 0xF149;  //  capital i with ogonek
205         case 0x012F: return 0xF169;  //  small i with ogonek
206         case 0x0130: return 0xE749;  //  capital i with dot above
207         case 0x0131: return 0xB8;  //  small dotless i
208         case 0x0134: return 0xE34A;  //  capital j with circumflex
209         case 0x0135: return 0xE36A;  //  small j with circumflex
210         case 0x0136: return 0xF04B;  //  capital k with cedilla
211         case 0x0137: return 0xF06B;  //  small k with cedilla
212         case 0x0139: return 0xE24C;  //  capital L with acute accent
213         case 0x013A: return 0xE26C;  //  small l with acute accent
214         case 0x013B: return 0xF04C;  //  capital l with cedilla
215         case 0x013C: return 0xF06C;  //  small l with cedilla
216         case 0x013D: return 0xE94C;  //  capital L with caron
217         case 0x013E: return 0xE96C;  //  small l with caron
218         case 0x0141: return 0xA1;  //  capital L with stroke
219         case 0x0142: return 0xB1;  //  small l with stroke
220         case 0x0143: return 0xE24E;  //  capital N with acute accent
221         case 0x0144: return 0xE26E;  //  small n with acute accent
222         case 0x0145: return 0xF04E;  //  capital n with cedilla
223         case 0x0146: return 0xF06E;  //  small n with cedilla
224         case 0x0147: return 0xE94E;  //  capital N with caron
225         case 0x0148: return 0xE96E;  //  small n with caron
226         case 0x014C: return 0xE54F;  //  capital o with macron
227         case 0x014D: return 0xE56F;  //  small o with macron
228         case 0x014E: return 0xE64F;  //  capital o with breve
229         case 0x014F: return 0xE66F;  //  small o with breve
230         case 0x0150: return 0xEE4F;  //  capital O with double acute
231         case 0x0151: return 0xEE6F;  //  small o with double acute
232         case 0x0152: return 0xA6;  //  capital ligature OE
233         case 0x0153: return 0xB6;  //  small ligature OE
234         case 0x0154: return 0xE252;  //  capital R with acute accent
235         case 0x0155: return 0xE272;  //  small r with acute accent
236         case 0x0156: return 0xF052;  //  capital r with cedilla
237         case 0x0157: return 0xF072;  //  small r with cedilla
238         case 0x0158: return 0xE952;  //  capital R with caron
239         case 0x0159: return 0xE972;  //  small r with caron
240         case 0x015A: return 0xE253;  //  capital S with acute accent
241         case 0x015B: return 0xE273;  //  small s with acute accent
242         case 0x015C: return 0xE353;  //  capital s with circumflex
243         case 0x015D: return 0xE373;  //  small s with circumflex
244         case 0x015E: return 0xF053;  //  capital S with cedilla
245         case 0x015F: return 0xF073;  //  small s with cedilla
246         case 0x0160: return 0xE953;  //  capital S with caron
247         case 0x0161: return 0xE973;  //  small s with caron
248         case 0x0162: return 0xF054;  //  capital T with cedilla
249         case 0x0163: return 0xF074;  //  small t with cedilla
250         case 0x0164: return 0xE954;  //  capital T with caron
251         case 0x0165: return 0xE974;  //  small t with caron
252         case 0x0168: return 0xE455;  //  capital u with tilde
253         case 0x0169: return 0xE475;  //  small u with tilde
254         case 0x016A: return 0xE555;  //  capital u with macron
255         case 0x016B: return 0xE575;  //  small u with macron
256         case 0x016C: return 0xE655;  //  capital u with breve
257         case 0x016D: return 0xE675;  //  small u with breve
258         case 0x016E: return 0xEAAD;  //  capital U with ring above
259         case 0x016F: return 0xEA75;  //  small u with ring above
260         case 0x0170: return 0xEE55;  //  capital U with double acute
261         case 0x0171: return 0xEE75;  //  small u with double acute
262         case 0x0172: return 0xF155;  //  capital u with ogonek
263         case 0x0173: return 0xF175;  //  small u with ogonek
264         case 0x0174: return 0xE357;  //  capital w with circumflex
265         case 0x0175: return 0xE377;  //  small w with circumflex
266         case 0x0176: return 0xE359;  //  capital y with circumflex
267         case 0x0177: return 0xE379;  //  small y with circumflex
268         case 0x0178: return 0xE859;  //  capital y with diaeresis
269         case 0x0179: return 0xE25A;  //  capital Z with acute accent
270         case 0x017A: return 0xE27A;  //  small z with acute accent
271         case 0x017B: return 0xE75A;  //  capital Z with dot above
272         case 0x017C: return 0xE77A;  //  small z with dot above
273         case 0x017D: return 0xE95A;  //  capital Z with caron
274         case 0x017E: return 0xE97A;  //  small z with caron
275         case 0x01A0: return 0xAC;  //  capital O with horn
276         case 0x01A1: return 0xBC;  //  small o with horn
277         case 0x01AF: return 0xAD;  //  capital U with horn
278         case 0x01B0: return 0xBD;  //  small u with horn
279         case 0x01CD: return 0xE941;  //  capital a with caron
280         case 0x01CE: return 0xE961;  //  small a with caron
281         case 0x01CF: return 0xE949;  //  capital i with caron
282         case 0x01D0: return 0xE969;  //  small i with caron
283         case 0x01D1: return 0xE94F;  //  capital o with caron
284         case 0x01D2: return 0xE96F;  //  small o with caron
285         case 0x01D3: return 0xE955;  //  capital u with caron
286         case 0x01D4: return 0xE975;  //  small u with caron
287         case 0x01E2: return 0xE5A5;  //  capital ae with macron
288         case 0x01E3: return 0xE5B5;  //  small ae with macron
289         case 0x01E6: return 0xE947;  //  capital g with caron
290         case 0x01E7: return 0xE967;  //  small g with caron
291         case 0x01E8: return 0xE94B;  //  capital k with caron
292         case 0x01E9: return 0xE96B;  //  small k with caron
293         case 0x01EA: return 0xF14F;  //  capital o with ogonek
294         case 0x01EB: return 0xF16F;  //  small o with ogonek
295         case 0x01F0: return 0xE96A;  //  small j with caron
296         case 0x01F4: return 0xE247;  //  capital g with acute
297         case 0x01F5: return 0xE267;  //  small g with acute
298         case 0x01FC: return 0xE2A5;  //  capital ae with acute
299         case 0x01FD: return 0xE2B5;  //  small ae with acute
300         case 0x02B9: return 0xA7;  //  modified letter prime
301         case 0x02BA: return 0xB7;  //  modified letter double prime
302         case 0x02BE: return 0xAE;  //  modifier letter right half ring
303         case 0x02BF: return 0xB0;  //  modifier letter left half ring
304         case 0x0300: return 0xE1;  //  grave accent
305         case 0x0301: return 0xE2;  //  acute accent
306         case 0x0302: return 0xE3;  //  circumflex accent
307         case 0x0303: return 0xE4;  //  tilde
308         case 0x0304: return 0xE5;  //  combining macron
309         case 0x0306: return 0xE6;  //  breve
310         case 0x0307: return 0xE7;  //  dot above
311         case 0x0309: return 0xE0;  //  hook above
312         case 0x030A: return 0xEA;  //  ring above
313         case 0x030B: return 0xEE;  //  double acute accent
314         case 0x030C: return 0xE9;  //  caron
315         case 0x0310: return 0xEF;  //  candrabindu
316         case 0x0313: return 0xFE;  //  comma above
317         case 0x0315: return 0xED;  //  comma above right
318         case 0x031C: return 0xF8;  //  combining half ring below
319         case 0x0323: return 0xF2;  //  dot below
320         case 0x0324: return 0xF3;  //  diaeresis below
321         case 0x0325: return 0xF4;  //  ring below
322         case 0x0326: return 0xF7;  //  comma below
323         case 0x0327: return 0xF0;  //  combining cedilla
324         case 0x0328: return 0xF1;  //  ogonek
325         case 0x032E: return 0xF9;  //  breve below
326         case 0x0332: return 0xF6;  //  low line (= line below?)
327         case 0x0333: return 0xF5;  //  double low line
328         case 0x1E00: return 0xF441;  //  capital a with ring below
329         case 0x1E01: return 0xF461;  //  small a with ring below
330         case 0x1E02: return 0xE742;  //  capital b with dot above
331         case 0x1E03: return 0xE762;  //  small b with dot above
332         case 0x1E04: return 0xF242;  //  capital b with dot below
333         case 0x1E05: return 0xF262;  //  small b with dot below
334         case 0x1E0A: return 0xE744;  //  capital d with dot above
335         case 0x1E0B: return 0xE764;  //  small d with dot above
336         case 0x1E0C: return 0xF244;  //  capital d with dot below
337         case 0x1E0D: return 0xF264;  //  small d with dot below
338         case 0x1E10: return 0xF044;  //  capital d with cedilla
339         case 0x1E11: return 0xF064;  //  small d with cedilla
340         case 0x1E1E: return 0xE746;  //  capital f with dot above
341         case 0x1E1F: return 0xE766;  //  small f with dot above
342         case 0x1E20: return 0xE547;  //  capital g with macron
343         case 0x1E21: return 0xE567;  //  small g with macron
344         case 0x1E22: return 0xE748;  //  capital h with dot above
345         case 0x1E23: return 0xE768;  //  small h with dot above
346         case 0x1E24: return 0xF248;  //  capital h with dot below
347         case 0x1E25: return 0xF268;  //  small h with dot below
348         case 0x1E26: return 0xE848;  //  capital h with diaeresis
349         case 0x1E27: return 0xE868;  //  small h with diaeresis
350         case 0x1E28: return 0xF048;  //  capital h with cedilla
351         case 0x1E29: return 0xF068;  //  small h with cedilla
352         case 0x1E2A: return 0xF948;  //  capital h with breve below
353         case 0x1E2B: return 0xF968;  //  small h with breve below
354         case 0x1E30: return 0xE24B;  //  capital k with acute
355         case 0x1E31: return 0xE26B;  //  small k with acute
356         case 0x1E32: return 0xF24B;  //  capital k with dot below
357         case 0x1E33: return 0xF26B;  //  small k with dot below
358         case 0x1E36: return 0xF24C;  //  capital l with dot below
359         case 0x1E37: return 0xF26C;  //  small l with dot below
360         case 0x1E3E: return 0xE24D;  //  capital m with acute
361         case 0x1E3F: return 0xE26D;  //  small m with acute
362         case 0x1E40: return 0xE74D;  //  capital m with dot above
363         case 0x1E41: return 0xE76D;  //  small m with dot above
364         case 0x1E42: return 0xF24D;  //  capital m with dot below
365         case 0x1E43: return 0xF26D;  //  small m with dot below
366         case 0x1E44: return 0xE74E;  //  capital n with dot above
367         case 0x1E45: return 0xE76E;  //  small n with dot above
368         case 0x1E46: return 0xF24E;  //  capital n with dot below
369         case 0x1E47: return 0xF26E;  //  small n with dot below
370         case 0x1E54: return 0xE250;  //  capital p with acute
371         case 0x1E55: return 0xE270;  //  small p with acute
372         case 0x1E56: return 0xE750;  //  capital p with dot above
373         case 0x1E57: return 0xE770;  //  small p with dot above
374         case 0x1E58: return 0xE752;  //  capital r with dot above
375         case 0x1E59: return 0xE772;  //  small r with dot above
376         case 0x1E5A: return 0xF252;  //  capital r with dot below
377         case 0x1E5B: return 0xF272;  //  small r with dot below
378         case 0x1E60: return 0xE753;  //  capital s with dot above
379         case 0x1E61: return 0xE773;  //  small s with dot above
380         case 0x1E62: return 0xF253;  //  capital s with dot below
381         case 0x1E63: return 0xF273;  //  small s with dot below
382         case 0x1E6A: return 0xE754;  //  capital t with dot above
383         case 0x1E6B: return 0xE774;  //  small t with dot above
384         case 0x1E6C: return 0xF254;  //  capital t with dot below
385         case 0x1E6D: return 0xF274;  //  small t with dot below
386         case 0x1E72: return 0xF355;  //  capital u with diaeresis below
387         case 0x1E73: return 0xF375;  //  small u with diaeresis below
388         case 0x1E7C: return 0xE456;  //  capital v with tilde
389         case 0x1E7D: return 0xE476;  //  small v with tilde
390         case 0x1E7E: return 0xF256;  //  capital v with dot below
391         case 0x1E7F: return 0xF276;  //  small v with dot below
392         case 0x1E80: return 0xE157;  //  capital w with grave
393         case 0x1E81: return 0xE177;  //  small w with grave
394         case 0x1E82: return 0xE257;  //  capital w with acute
395         case 0x1E83: return 0xE277;  //  small w with acute
396         case 0x1E84: return 0xE857;  //  capital w with diaeresis
397         case 0x1E85: return 0xE877;  //  small w with diaeresis
398         case 0x1E86: return 0xE757;  //  capital w with dot above
399         case 0x1E87: return 0xE777;  //  small w with dot above
400         case 0x1E88: return 0xF257;  //  capital w with dot below
401         case 0x1E89: return 0xF277;  //  small w with dot below
402         case 0x1E8A: return 0xE758;  //  capital x with dot above
403         case 0x1E8B: return 0xE778;  //  small x with dot above
404         case 0x1E8C: return 0xE858;  //  capital x with diaeresis
405         case 0x1E8D: return 0xE878;  //  small x with diaeresis
406         case 0x1E8E: return 0xE759;  //  capital y with dot above
407         case 0x1E8F: return 0xE779;  //  small y with dot above
408         case 0x1E90: return 0xE35A;  //  capital z with circumflex
409         case 0x1E91: return 0xE37A;  //  small z with circumflex
410         case 0x1E92: return 0xF25A;  //  capital z with dot below
411         case 0x1E93: return 0xF27A;  //  small z with dot below
412         case 0x1E97: return 0xE874;  //  small t with diaeresis
413         case 0x1E98: return 0xEA77;  //  small w with ring above
414         case 0x1E99: return 0xEA79;  //  small y with ring above
415         case 0x1EA0: return 0xF241;  //  capital a with dot below
416         case 0x1EA1: return 0xF261;  //  small a with dot below
417         case 0x1EA2: return 0xE041;  //  capital a with hook above
418         case 0x1EA3: return 0xE061;  //  small a with hook above
419         case 0x1EB8: return 0xF245;  //  capital e with dot below
420         case 0x1EB9: return 0xF265;  //  small e with dot below
421         case 0x1EBA: return 0xE045;  //  capital e with hook above
422         case 0x1EBB: return 0xE065;  //  small e with hook above
423         case 0x1EBC: return 0xE445;  //  capital e with tilde
424         case 0x1EBD: return 0xE465;  //  small e with tilde
425         case 0x1EC8: return 0xE049;  //  capital i with hook above
426         case 0x1EC9: return 0xE069;  //  small i with hook above
427         case 0x1ECA: return 0xF249;  //  capital i with dot below
428         case 0x1ECB: return 0xF269;  //  small i with dot below
429         case 0x1ECC: return 0xF24F;  //  capital o with dot below
430         case 0x1ECD: return 0xF26F;  //  small o with dot below
431         case 0x1ECE: return 0xE04F;  //  capital o with hook above
432         case 0x1ECF: return 0xE06F;  //  small o with hook above
433         case 0x1EE4: return 0xF255;  //  capital u with dot below
434         case 0x1EE5: return 0xF275;  //  small u with dot below
435         case 0x1EE6: return 0xE055;  //  capital u with hook above
436         case 0x1EE7: return 0xE075;  //  small u with hook above
437         case 0x1EF2: return 0xE159;  //  capital y with grave
438         case 0x1EF3: return 0xE179;  //  small y with grave
439         case 0x1EF4: return 0xF259;  //  capital y with dot below
440         case 0x1EF5: return 0xF279;  //  small y with dot below
441         case 0x1EF6: return 0xE059;  //  capital y with hook above
442         case 0x1EF7: return 0xE079;  //  small y with hook above
443         case 0x1EF8: return 0xE459;  //  capital y with tilde
444         case 0x1EF9: return 0xE479;  //  small y with tilde
445         case 0x200C: return 0x8E;  //  zero width non-joiner
446         case 0x200D: return 0x8D;  //  zero width joiner
447         case 0x2113: return 0xC1;  //  script small l
448         case 0x2117: return 0xC2;  //  sound recording copyright
449         case 0x266D: return 0xA9;  //  music flat sign
450         case 0x266F: return 0xC4;  //  music sharp sign
451         case 0xFE20: return 0xEB;  //  ligature left half
452         case 0xFE21: return 0xEC;  //  ligature right half
453         case 0xFE22: return 0xFA;  //  double tilde left half
454         case 0xFE23: return 0xFB;  //  double tilde right half
455 
456         default: return 0xC5;     // if no match, use inverted '?'
457       } //end switch
458 
459       /* Note: this conversion table is currently the exact inverse of that used in
460       * ANSELInputStreamReader. Ideally it should also provide fallback conversion for
461       * UNICODE characters that are never generated by ANSELInputStreamReader, e.g.
462       * free-standing accents. For future work.
463       */
464     }
465 
466 
467 }
468