Original 2.4
[marc4j.git] / src / org / marc4j / converter / impl / UnicodeToIso6937.java
1 // $Id: UnicodeToIso6937.java,v 1.3 2008/10/17 06:47:06 haschart Exp $\r
2 /**\r
3  * Copyright (C) 2002 Bas Peters (mail@bpeters.com)\r
4  *\r
5  * This file is part of MARC4J\r
6  *\r
7  * MARC4J is free software; you can redistribute it and/or\r
8  * modify it under the terms of the GNU Lesser General Public \r
9  * License as published by the Free Software Foundation; either \r
10  * version 2.1 of the License, or (at your option) any later version.\r
11  *\r
12  * MARC4J is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
15  * Lesser General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU Lesser General Public \r
18  * License along with MARC4J; if not, write to the Free Software\r
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
20  */\r
21 package org.marc4j.converter.impl;\r
22 \r
23 import org.marc4j.converter.CharConverter;\r
24 \r
25 /**\r
26  * <p>\r
27  * A utility to convert UCS/Unicode data to ISO 6937.\r
28  * </p>\r
29  * \r
30  * @author Bas Peters\r
31  * @author Yves Pratter\r
32  * @version $Revision: 1.3 $\r
33  */\r
34 public class UnicodeToIso6937 extends CharConverter {\r
35 \r
36   /**\r
37    * <p>\r
38    * Converts UCS/Unicode data to ISO 6937.\r
39    * </p>\r
40    * \r
41    * <p>\r
42    * A question mark (0x3F) is returned if there is no match.\r
43    * </p>\r
44    * \r
45    * @param data - the UCS/Unicode data in an array of char\r
46    * @return {@link String}- the ISO 6937 data\r
47    */\r
48   public String convert(char data[]) {\r
49     StringBuffer sb = new StringBuffer();\r
50     for (int i = 0; i < data.length; i++) {\r
51       char c = data[i];\r
52       if (c < 128)\r
53         sb.append(c);\r
54       else {\r
55         int d = convert(c);\r
56         if (d < 256) {\r
57           sb.append((char) d);\r
58         } else {\r
59           sb.append((char) (d / 256));\r
60           sb.append((char) (d % 256));\r
61         }\r
62       }\r
63     }\r
64     return sb.toString();\r
65   }\r
66 \r
67   private int convert(int i) {\r
68     switch (i) {\r
69     case 0x00A0:\r
70       return 0xA0; // 10/00 NO-BREAK SPACE\r
71     case 0x00A1:\r
72       return 0xA1; // 10/01 INVERTED EXCLAMATION MARK\r
73     case 0x00A2:\r
74       return 0xA2; // 10/02 CENT SIGN\r
75     case 0x00A3:\r
76       return 0xA3; // 10/03 POUND SIGN\r
77     case 0x00A4:\r
78       return 0xA8; // 10/08 CURRENCY SIGN\r
79     case 0x00A5:\r
80       return 0xA5; // 10/05 YEN SIGN\r
81     case 0x00A6:\r
82       return 0xD7; // 13/07 BROKEN BAR\r
83     case 0x00A7:\r
84       return 0xA7; // 10/07 SECTION SIGN\r
85     case 0x00A8:\r
86       return 0xC820; // DIAERESIS\r
87     case 0x00A9:\r
88       return 0xD3; // 13/03 COPYRIGHT SIGN\r
89     case 0x00AA:\r
90       return 0xE3; // 14/03 FEMININE ORDINAL INDICATOR\r
91     case 0x00AB:\r
92       return 0xAB; // 10/11 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK\r
93     case 0x00AC:\r
94       return 0xD6; // 13/06 NOT SIGN\r
95     case 0x00AD:\r
96       return 0xFF; // 15/15 SOFT HYPHEN\r
97     case 0x00AE:\r
98       return 0xD4; // 13/04 TRADE MARK SIGN\r
99     case 0x00B0:\r
100       return 0xB0; // 11/00 DEGREE SIGN\r
101     case 0x00B1:\r
102       return 0xB1; // 11/01 PLUS-MINUS SIGN\r
103     case 0x00B2:\r
104       return 0xB2; // 11/02 SUPERSCRIPT TWO\r
105     case 0x00B3:\r
106       return 0xB3; // 11/03 SUPERSCRIPT THREE\r
107     case 0x00B4:\r
108       return 0xC220; // ACUTE ACCENT\r
109     case 0x00B5:\r
110       return 0xB5; // 11/05 MICRO SIGN\r
111     case 0x00B6:\r
112       return 0xB6; // 11/06 PILCROW SIGN\r
113     case 0x00B7:\r
114       return 0xB7; // 11/07 MIDDLE DOT\r
115     case 0x00B8:\r
116       return 0xCB20; // CEDILLA\r
117     case 0x00B9:\r
118       return 0xD1; // 13/01 SUPERSCRIPT ONE\r
119     case 0x00BA:\r
120       return 0xEB; // 14/11 MASCULINE ORDINAL INDICATOR\r
121     case 0x00BB:\r
122       return 0xBB; // 11/11 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK\r
123     case 0x00BC:\r
124       return 0xBC; // 11/12 VULGAR FRACTION ONE QUARTER\r
125     case 0x00BD:\r
126       return 0xBD; // 11/13 VULGAR FRACTION ONE HALF\r
127     case 0x00BE:\r
128       return 0xBE; // 11/14 VULGAR FRACTION THREE QUARTERS\r
129     case 0x00BF:\r
130       return 0xBF; // 11/15 INVERTED QUESTION MARK\r
131     case 0x00C0:\r
132       return 0xC141; // LATIN CAPITAL LETTER A WITH GRAVE\r
133     case 0x00C1:\r
134       return 0xC241; // LATIN CAPITAL LETTER A WITH ACUTE\r
135     case 0x00C2:\r
136       return 0xC341; // LATIN CAPITAL LETTER A WITH CIRCUMFLEX\r
137     case 0x00C3:\r
138       return 0xC441; // LATIN CAPITAL LETTER A WITH TILDE\r
139     case 0x00C4:\r
140       return 0xC841; // LATIN CAPITAL LETTER A WITH DIAERESIS\r
141     case 0x00C5:\r
142       return 0xCA41; // LATIN CAPITAL LETTER A WITH RING ABOVE\r
143     case 0x00C6:\r
144       return 0xE1; // 14/01 LATIN CAPITAL LETTER AE\r
145     case 0x00C7:\r
146       return 0xCB43; // LATIN CAPITAL LETTER C WITH CEDILLA\r
147     case 0x00C8:\r
148       return 0xC145; // LATIN CAPITAL LETTER E WITH GRAVE\r
149     case 0x00C9:\r
150       return 0xC245; // LATIN CAPITAL LETTER E WITH ACUTE\r
151     case 0x00CA:\r
152       return 0xC345; // LATIN CAPITAL LETTER E WITH CIRCUMFLEX\r
153     case 0x00CB:\r
154       return 0xC845; // LATIN CAPITAL LETTER E WITH DIAERESIS\r
155     case 0x00CC:\r
156       return 0xC149; // LATIN CAPITAL LETTER I WITH GRAVE\r
157     case 0x00CD:\r
158       return 0xC249; // LATIN CAPITAL LETTER I WITH ACUTE\r
159     case 0x00CE:\r
160       return 0xC349; // LATIN CAPITAL LETTER I WITH CIRCUMFLEX\r
161     case 0x00CF:\r
162       return 0xC849; // LATIN CAPITAL LETTER I WITH DIAERESIS\r
163     case 0x00D1:\r
164       return 0xC44E; // LATIN CAPITAL LETTER N WITH TILDE\r
165     case 0x00D2:\r
166       return 0xC14F; // LATIN CAPITAL LETTER O WITH GRAVE\r
167     case 0x00D3:\r
168       return 0xC24F; // LATIN CAPITAL LETTER O WITH ACUTE\r
169     case 0x00D4:\r
170       return 0xC34F; // LATIN CAPITAL LETTER O WITH CIRCUMFLEX\r
171     case 0x00D5:\r
172       return 0xC44F; // LATIN CAPITAL LETTER O WITH TILDE\r
173     case 0x00D6:\r
174       return 0xC84F; // LATIN CAPITAL LETTER O WITH DIAERESIS\r
175     case 0x00D7:\r
176       return 0xB4; // 11/04 MULTIPLICATION SIGN\r
177     case 0x00D8:\r
178       return 0xE9; // 14/09 LATIN CAPITAL LETTER O WITH STROKE\r
179     case 0x00D9:\r
180       return 0xC155; // LATIN CAPITAL LETTER U WITH GRAVE\r
181     case 0x00DA:\r
182       return 0xC255; // LATIN CAPITAL LETTER U WITH ACUTE\r
183     case 0x00DB:\r
184       return 0xC355; // LATIN CAPITAL LETTER U WITH CIRCUMFLEX\r
185     case 0x00DC:\r
186       return 0xC855; // LATIN CAPITAL LETTER U WITH DIAERESIS\r
187     case 0x00DD:\r
188       return 0xC259; // LATIN CAPITAL LETTER Y WITH ACUTE\r
189     case 0x00DE:\r
190       return 0xEC; // 14/12 LATIN CAPITAL LETTER THORN\r
191     case 0x00DF:\r
192       return 0xFB; // 15/11 LATIN SMALL LETTER SHARP S\r
193     case 0x00E0:\r
194       return 0xC161; // LATIN SMALL LETTER A WITH GRAVE\r
195     case 0x00E1:\r
196       return 0xC261; // LATIN SMALL LETTER A WITH ACUTE\r
197     case 0x00E2:\r
198       return 0xC361; // LATIN SMALL LETTER A WITH CIRCUMFLEX\r
199     case 0x00E3:\r
200       return 0xC461; // LATIN SMALL LETTER A WITH TILDE\r
201     case 0x00E4:\r
202       return 0xC861; // LATIN SMALL LETTER A WITH DIAERESIS\r
203     case 0x00E5:\r
204       return 0xCA61; // LATIN SMALL LETTER A WITH RING ABOVE\r
205     case 0x00E6:\r
206       return 0xF1; // 15/01 LATIN SMALL LETTER AE\r
207     case 0x00E7:\r
208       return 0xCB63; // LATIN SMALL LETTER C WITH CEDILLA\r
209     case 0x00E8:\r
210       return 0xC165; // LATIN SMALL LETTER E WITH GRAVE\r
211     case 0x00E9:\r
212       return 0xC265; // LATIN SMALL LETTER E WITH ACUTE\r
213     case 0x00EA:\r
214       return 0xC365; // LATIN SMALL LETTER E WITH CIRCUMFLEX\r
215     case 0x00EB:\r
216       return 0xC865; // LATIN SMALL LETTER E WITH DIAERESIS\r
217     case 0x00EC:\r
218       return 0xC169; // LATIN SMALL LETTER I WITH GRAVE\r
219     case 0x00ED:\r
220       return 0xC269; // LATIN SMALL LETTER I WITH ACUTE\r
221     case 0x00EE:\r
222       return 0xC369; // LATIN SMALL LETTER I WITH CIRCUMFLEX\r
223     case 0x00EF:\r
224       return 0xC869; // LATIN SMALL LETTER I WITH DIAERESIS\r
225     case 0x00F0:\r
226       return 0xF3; // 15/03 LATIN SMALL LETTER ETH\r
227     case 0x00F1:\r
228       return 0xC46E; // LATIN SMALL LETTER N WITH TILDE\r
229     case 0x00F2:\r
230       return 0xC16F; // LATIN SMALL LETTER O WITH GRAVE\r
231     case 0x00F3:\r
232       return 0xC26F; // LATIN SMALL LETTER O WITH ACUTE\r
233     case 0x00F4:\r
234       return 0xC36F; // LATIN SMALL LETTER O WITH CIRCUMFLEX\r
235     case 0x00F5:\r
236       return 0xC46F; // LATIN SMALL LETTER O WITH TILDE\r
237     case 0x00F6:\r
238       return 0xC86F; // LATIN SMALL LETTER O WITH DIAERESIS\r
239     case 0x00F7:\r
240       return 0xB8; // 11/08 DIVISION SIGN\r
241     case 0x00F8:\r
242       return 0xF9; // 15/09 LATIN SMALL LETTER O WITH STROKE\r
243     case 0x00F9:\r
244       return 0xC175; // LATIN SMALL LETTER U WITH GRAVE\r
245     case 0x00FA:\r
246       return 0xC275; // LATIN SMALL LETTER U WITH ACUTE\r
247     case 0x00FB:\r
248       return 0xC375; // LATIN SMALL LETTER U WITH CIRCUMFLEX\r
249     case 0x00FC:\r
250       return 0xC875; // LATIN SMALL LETTER U WITH DIAERESIS\r
251     case 0x00FD:\r
252       return 0xC279; // LATIN SMALL LETTER Y WITH ACUTE\r
253     case 0x00FE:\r
254       return 0xFC; // 15/12 LATIN SMALL LETTER THORN\r
255     case 0x00FF:\r
256       return 0xC879; // LATIN SMALL LETTER Y WITH DIAERESIS\r
257     case 0x0100:\r
258       return 0xC541; // LATIN CAPITAL LETTER A WITH MACRON\r
259     case 0x0101:\r
260       return 0xC561; // LATIN SMALL LETTER A WITH MACRON\r
261     case 0x0102:\r
262       return 0xC641; // LATIN CAPITAL LETTER A WITH BREVE\r
263     case 0x0103:\r
264       return 0xC661; // LATIN SMALL LETTER A WITH BREVE\r
265     case 0x0104:\r
266       return 0xCE41; // LATIN CAPITAL LETTER A WITH OGONEK\r
267     case 0x0105:\r
268       return 0xCE61; // LATIN SMALL LETTER A WITH OGONEK\r
269     case 0x0106:\r
270       return 0xC243; // LATIN CAPITAL LETTER C WITH ACUTE\r
271     case 0x0107:\r
272       return 0xC263; // LATIN SMALL LETTER C WITH ACUTE\r
273     case 0x0108:\r
274       return 0xC343; // LATIN CAPITAL LETTER C WITH CIRCUMFLEX\r
275     case 0x0109:\r
276       return 0xC363; // LATIN SMALL LETTER C WITH CIRCUMFLEX\r
277     case 0x010A:\r
278       return 0xC743; // LATIN CAPITAL LETTER C WITH DOT ABOVE\r
279     case 0x010B:\r
280       return 0xC763; // LATIN SMALL LETTER C WITH DOT ABOVE\r
281     case 0x010C:\r
282       return 0xCF43; // LATIN CAPITAL LETTER C WITH CARON\r
283     case 0x010D:\r
284       return 0xCF63; // LATIN SMALL LETTER C WITH CARON\r
285     case 0x010E:\r
286       return 0xCF44; // LATIN CAPITAL LETTER D WITH CARON\r
287     case 0x010F:\r
288       return 0xCF64; // LATIN SMALL LETTER D WITH CARON\r
289     case 0x0110:\r
290       return 0xE2; // 14/02 LATIN CAPITAL LETTER D WITH STROKE\r
291     case 0x0111:\r
292       return 0xF2; // 15/02 LATIN SMALL LETTER D WITH STROKE\r
293     case 0x0112:\r
294       return 0xC545; // LATIN CAPITAL LETTER E WITH MACRON\r
295     case 0x0113:\r
296       return 0xC565; // LATIN SMALL LETTER E WITH MACRON\r
297     case 0x0116:\r
298       return 0xC745; // LATIN CAPITAL LETTER E WITH DOT ABOVE\r
299     case 0x0117:\r
300       return 0xC765; // LATIN SMALL LETTER E WITH DOT ABOVE\r
301     case 0x0118:\r
302       return 0xCE45; // LATIN CAPITAL LETTER E WITH OGONEK\r
303     case 0x0119:\r
304       return 0xCE65; // LATIN SMALL LETTER E WITH OGONEK\r
305     case 0x011A:\r
306       return 0xCF45; // LATIN CAPITAL LETTER E WITH CARON\r
307     case 0x011B:\r
308       return 0xCF65; // LATIN SMALL LETTER E WITH CARON\r
309     case 0x011C:\r
310       return 0xC347; // LATIN CAPITAL LETTER G WITH CIRCUMFLEX\r
311     case 0x011D:\r
312       return 0xC367; // LATIN SMALL LETTER G WITH CIRCUMFLEX\r
313     case 0x011E:\r
314       return 0xC647; // LATIN CAPITAL LETTER G WITH BREVE\r
315     case 0x011F:\r
316       return 0xC667; // LATIN SMALL LETTER G WITH BREVE\r
317     case 0x0120:\r
318       return 0xC747; // LATIN CAPITAL LETTER G WITH DOT ABOVE\r
319     case 0x0121:\r
320       return 0xC767; // LATIN SMALL LETTER G WITH DOT ABOVE\r
321     case 0x0122:\r
322       return 0xCB47; // LATIN CAPITAL LETTER G WITH CEDILLA\r
323     //          case 0x0123: return 0xCB67; // small g with cedilla\r
324     case 0x0124:\r
325       return 0xC348; // LATIN CAPITAL LETTER H WITH CIRCUMFLEX\r
326     case 0x0125:\r
327       return 0xC368; // LATIN SMALL LETTER H WITH CIRCUMFLEX\r
328     case 0x0126:\r
329       return 0xE4; // 14/04 LATIN CAPITAL LETTER H WITH STROKE\r
330     case 0x0127:\r
331       return 0xF4; // 15/04 LATIN SMALL LETTER H WITH STROKE\r
332     case 0x0128:\r
333       return 0xC449; // LATIN CAPITAL LETTER I WITH TILDE\r
334     case 0x0129:\r
335       return 0xC469; // LATIN SMALL LETTER I WITH TILDE\r
336     case 0x012A:\r
337       return 0xC549; // LATIN CAPITAL LETTER I WITH MACRON\r
338     case 0x012B:\r
339       return 0xC569; // LATIN SMALL LETTER I WITH MACRON\r
340     case 0x012E:\r
341       return 0xCE49; // LATIN CAPITAL LETTER I WITH OGONEK\r
342     case 0x012F:\r
343       return 0xCE69; // LATIN SMALL LETTER I WITH OGONEK\r
344     case 0x0130:\r
345       return 0xC749; // LATIN CAPITAL LETTER I WITH DOT ABOVE\r
346     case 0x0131:\r
347       return 0xF5; // 15/05 LATIN SMALL LETTER DOTLESS I\r
348     case 0x0132:\r
349       return 0xE6; // 14/06 LATIN CAPITAL LIGATURE IJ\r
350     case 0x0133:\r
351       return 0xF6; // 15/06 LATIN SMALL LIGATURE IJ\r
352     case 0x0134:\r
353       return 0xC34A; // LATIN CAPITAL LETTER J WITH CIRCUMFLEX\r
354     case 0x0135:\r
355       return 0xC36A; // LATIN SMALL LETTER J WITH CIRCUMFLEX\r
356     case 0x0136:\r
357       return 0xCB4B; // LATIN CAPITAL LETTER K WITH CEDILLA\r
358     case 0x0137:\r
359       return 0xCB6B; // LATIN SMALL LETTER K WITH CEDILLA\r
360     case 0x0138:\r
361       return 0xF0; // 15/00 LATIN SMALL LETTER KRA\r
362     case 0x0139:\r
363       return 0xC24C; // LATIN CAPITAL LETTER L WITH ACUTE\r
364     case 0x013A:\r
365       return 0xC26C; // LATIN SMALL LETTER L WITH ACUTE\r
366     case 0x013B:\r
367       return 0xCB4C; // LATIN CAPITAL LETTER L WITH CEDILLA\r
368     case 0x013C:\r
369       return 0xCB6C; // LATIN SMALL LETTER L WITH CEDILLA\r
370     case 0x013D:\r
371       return 0xCF4C; // LATIN CAPITAL LETTER L WITH CARON\r
372     case 0x013E:\r
373       return 0xCF6C; // LATIN SMALL LETTER L WITH CARON\r
374     case 0x013F:\r
375       return 0xE7; // 14/07 LATIN CAPITAL LETTER L WITH MIDDLE DOT\r
376     case 0x0140:\r
377       return 0xF7; // 15/07 LATIN SMALL LETTER L WITH MIDDLE DOT\r
378     case 0x0141:\r
379       return 0xE8; // 14/08 LATIN CAPITAL LETTER L WITH STROKE\r
380     case 0x0142:\r
381       return 0xF8; // 15/08 LATIN SMALL LETTER L WITH STROKE\r
382     case 0x0143:\r
383       return 0xC24E; // LATIN CAPITAL LETTER N WITH ACUTE\r
384     case 0x0144:\r
385       return 0xC26E; // LATIN SMALL LETTER N WITH ACUTE\r
386     case 0x0145:\r
387       return 0xCB4E; // LATIN CAPITAL LETTER N WITH CEDILLA\r
388     case 0x0146:\r
389       return 0xCB6E; // LATIN SMALL LETTER N WITH CEDILLA\r
390     case 0x0147:\r
391       return 0xCF4E; // LATIN CAPITAL LETTER N WITH CARON\r
392     case 0x0148:\r
393       return 0xCF6E; // LATIN SMALL LETTER N WITH CARON\r
394     case 0x0149:\r
395       return 0xEF; // 14/15 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE\r
396     case 0x014A:\r
397       return 0xEE; // 14/14 LATIN CAPITAL LETTER ENG\r
398     case 0x014B:\r
399       return 0xFE; // 15/14 LATIN SMALL LETTER ENG\r
400     case 0x014C:\r
401       return 0xC54F; // LATIN CAPITAL LETTER O WITH MACRON\r
402     case 0x014D:\r
403       return 0xC56F; // LATIN SMALL LETTER O WITH MACRON\r
404     case 0x0150:\r
405       return 0xCD4F; // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE\r
406     case 0x0151:\r
407       return 0xCD6F; // LATIN SMALL LETTER O WITH DOUBLE ACUTE\r
408     case 0x0152:\r
409       return 0xEA; // 14/10 LATIN CAPITAL LIGATURE OE\r
410     case 0x0153:\r
411       return 0xFA; // 15/10 LATIN SMALL LIGATURE OE\r
412     case 0x0154:\r
413       return 0xC252; // LATIN CAPITAL LETTER R WITH ACUTE\r
414     case 0x0155:\r
415       return 0xC272; // LATIN SMALL LETTER R WITH ACUTE\r
416     case 0x0156:\r
417       return 0xCB52; // LATIN CAPITAL LETTER R WITH CEDILLA\r
418     case 0x0157:\r
419       return 0xCB72; // LATIN SMALL LETTER R WITH CEDILLA\r
420     case 0x0158:\r
421       return 0xCF52; // LATIN CAPITAL LETTER R WITH CARON\r
422     case 0x0159:\r
423       return 0xCF72; // LATIN SMALL LETTER R WITH CARON\r
424     case 0x015A:\r
425       return 0xC253; // LATIN CAPITAL LETTER S WITH ACUTE\r
426     case 0x015B:\r
427       return 0xC273; // LATIN SMALL LETTER S WITH ACUTE\r
428     case 0x015C:\r
429       return 0xC353; // LATIN CAPITAL LETTER S WITH CIRCUMFLEX\r
430     case 0x015D:\r
431       return 0xC373; // LATIN SMALL LETTER S WITH CIRCUMFLEX\r
432     case 0x015E:\r
433       return 0xCB53; // LATIN CAPITAL LETTER S WITH CEDILLA\r
434     case 0x015F:\r
435       return 0xCB73; // LATIN SMALL LETTER S WITH CEDILLA\r
436     case 0x0160:\r
437       return 0xCF53; // LATIN CAPITAL LETTER S WITH CARON\r
438     case 0x0161:\r
439       return 0xCF73; // LATIN SMALL LETTER S WITH CARON\r
440     case 0x0162:\r
441       return 0xCB54; // LATIN CAPITAL LETTER T WITH CEDILLA\r
442     case 0x0163:\r
443       return 0xCB74; // LATIN SMALL LETTER T WITH CEDILLA\r
444     case 0x0164:\r
445       return 0xCF54; // LATIN CAPITAL LETTER T WITH CARON\r
446     case 0x0165:\r
447       return 0xCF74; // LATIN SMALL LETTER T WITH CARON\r
448     case 0x0166:\r
449       return 0xED; // 14/13 LATIN CAPITAL LETTER T WITH STROKE\r
450     case 0x0167:\r
451       return 0xFD; // 15/13 LATIN SMALL LETTER T WITH STROKE\r
452     case 0x0168:\r
453       return 0xC455; // LATIN CAPITAL LETTER U WITH TILDE\r
454     case 0x0169:\r
455       return 0xC475; // LATIN SMALL LETTER U WITH TILDE\r
456     case 0x016A:\r
457       return 0xC555; // LATIN CAPITAL LETTER U WITH MACRON\r
458     case 0x016B:\r
459       return 0xC575; // LATIN SMALL LETTER U WITH MACRON\r
460     case 0x016C:\r
461       return 0xC655; // LATIN CAPITAL LETTER U WITH BREVE\r
462     case 0x016D:\r
463       return 0xC675; // LATIN SMALL LETTER U WITH BREVE\r
464     case 0x016E:\r
465       return 0xCAAD; // LATIN CAPITAL LETTER U WITH RING ABOVE\r
466     case 0x016F:\r
467       return 0xCA75; // LATIN SMALL LETTER U WITH RING ABOVE\r
468     case 0x0170:\r
469       return 0xCD55; // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE\r
470     case 0x0171:\r
471       return 0xCD75; // LATIN SMALL LETTER U WITH DOUBLE ACUTE\r
472     case 0x0172:\r
473       return 0xCE55; // LATIN CAPITAL LETTER U WITH OGONEK\r
474     case 0x0173:\r
475       return 0xCE75; // LATIN SMALL LETTER U WITH OGONEK\r
476     case 0x0174:\r
477       return 0xC357; // LATIN CAPITAL LETTER W WITH CIRCUMFLEX\r
478     case 0x0175:\r
479       return 0xC377; // LATIN SMALL LETTER W WITH CIRCUMFLEX\r
480     case 0x0176:\r
481       return 0xC359; // LATIN CAPITAL LETTER Y WITH CIRCUMFLEX\r
482     case 0x0177:\r
483       return 0xC379; // LATIN SMALL LETTER Y WITH CIRCUMFLEX\r
484     case 0x0178:\r
485       return 0xC859; // LATIN CAPITAL LETTER Y WITH DIAERESIS\r
486     case 0x0179:\r
487       return 0xC25A; // LATIN CAPITAL LETTER Z WITH ACUTE\r
488     case 0x017A:\r
489       return 0xC27A; // LATIN SMALL LETTER Z WITH ACUTE\r
490     case 0x017B:\r
491       return 0xC75A; // LATIN CAPITAL LETTER Z WITH DOT ABOVE\r
492     case 0x017C:\r
493       return 0xC77A; // LATIN SMALL LETTER Z WITH DOT ABOVE\r
494     case 0x017D:\r
495       return 0xCF5A; // LATIN CAPITAL LETTER Z WITH CARON\r
496     case 0x017E:\r
497       return 0xCF7A; // LATIN SMALL LETTER Z WITH CARON\r
498     case 0x01F5:\r
499       return 0xC267; // LATIN SMALL LETTER G WITH CEDILLA(4)\r
500     case 0x02C7:\r
501       return 0xCF20; // CARON\r
502     case 0x02D8:\r
503       return 0xC620; // BREVE\r
504     case 0x02DA:\r
505       return 0xCA20; // RING ABOVE\r
506     case 0x02DB:\r
507       return 0xCE20; // ogonek\r
508     case 0x2015:\r
509       return 0xD0; // 13/00 HORIZONTAL BAR\r
510     case 0x2018:\r
511       return 0xA9; // 10/09 LEFT SINGLE QUOTATION MARK\r
512     case 0x2019:\r
513       return 0xB9; // 11/09 RIGHT SINGLE QUOTATION MARK\r
514     case 0x201C:\r
515       return 0xAA; // 10/10 LEFT DOUBLE QUOTATION MARK\r
516     case 0x201D:\r
517       return 0xBA; // 11/10 RIGHT DOUBLE QUOTATION MARK\r
518     case 0x2117:\r
519       return 0xD2; // 13/02 REGISTERED SIGN\r
520     case 0x2126:\r
521       return 0xE0; // 14/00 OHM SIGN\r
522     case 0x215B:\r
523       return 0xDC; // 13/12 VULGAR FRACTION ONE EIGHTH\r
524     case 0x215E:\r
525       return 0xDF; // 13/15 VULGAR FRACTION SEVEN EIGHTHS\r
526     case 0x2190:\r
527       return 0xAC; // 10/12 LEFTWARDS ARROW\r
528     case 0x2191:\r
529       return 0xAD; // 10/13 UPWARDS ARROW\r
530     case 0x2192:\r
531       return 0xAE; // 10/14 RIGHTWARDS ARROW\r
532     case 0x2193:\r
533       return 0xAF; // 10/15 DOWNWARDS ARROW\r
534     case 0x266A:\r
535       return 0xD5; // 13/05 EIGHTH NOTE\r
536 \r
537     default:\r
538       return 0x3F; // if no match, return question mark\r
539     }\r
540   }\r
541 }