1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.vcard;
18
19import java.util.HashMap;
20import java.util.Map;
21
22/**
23 * TextUtils especially for Japanese.
24 */
25/* package */ class JapaneseUtils {
26    static private final Map<Character, String> sHalfWidthMap =
27        new HashMap<Character, String>();
28
29    static {
30        sHalfWidthMap.put('\u3001', "\uFF64");
31        sHalfWidthMap.put('\u3002', "\uFF61");
32        sHalfWidthMap.put('\u300C', "\uFF62");
33        sHalfWidthMap.put('\u300D', "\uFF63");
34        sHalfWidthMap.put('\u301C', "~");
35        sHalfWidthMap.put('\u3041', "\uFF67");
36        sHalfWidthMap.put('\u3042', "\uFF71");
37        sHalfWidthMap.put('\u3043', "\uFF68");
38        sHalfWidthMap.put('\u3044', "\uFF72");
39        sHalfWidthMap.put('\u3045', "\uFF69");
40        sHalfWidthMap.put('\u3046', "\uFF73");
41        sHalfWidthMap.put('\u3047', "\uFF6A");
42        sHalfWidthMap.put('\u3048', "\uFF74");
43        sHalfWidthMap.put('\u3049', "\uFF6B");
44        sHalfWidthMap.put('\u304A', "\uFF75");
45        sHalfWidthMap.put('\u304B', "\uFF76");
46        sHalfWidthMap.put('\u304C', "\uFF76\uFF9E");
47        sHalfWidthMap.put('\u304D', "\uFF77");
48        sHalfWidthMap.put('\u304E', "\uFF77\uFF9E");
49        sHalfWidthMap.put('\u304F', "\uFF78");
50        sHalfWidthMap.put('\u3050', "\uFF78\uFF9E");
51        sHalfWidthMap.put('\u3051', "\uFF79");
52        sHalfWidthMap.put('\u3052', "\uFF79\uFF9E");
53        sHalfWidthMap.put('\u3053', "\uFF7A");
54        sHalfWidthMap.put('\u3054', "\uFF7A\uFF9E");
55        sHalfWidthMap.put('\u3055', "\uFF7B");
56        sHalfWidthMap.put('\u3056', "\uFF7B\uFF9E");
57        sHalfWidthMap.put('\u3057', "\uFF7C");
58        sHalfWidthMap.put('\u3058', "\uFF7C\uFF9E");
59        sHalfWidthMap.put('\u3059', "\uFF7D");
60        sHalfWidthMap.put('\u305A', "\uFF7D\uFF9E");
61        sHalfWidthMap.put('\u305B', "\uFF7E");
62        sHalfWidthMap.put('\u305C', "\uFF7E\uFF9E");
63        sHalfWidthMap.put('\u305D', "\uFF7F");
64        sHalfWidthMap.put('\u305E', "\uFF7F\uFF9E");
65        sHalfWidthMap.put('\u305F', "\uFF80");
66        sHalfWidthMap.put('\u3060', "\uFF80\uFF9E");
67        sHalfWidthMap.put('\u3061', "\uFF81");
68        sHalfWidthMap.put('\u3062', "\uFF81\uFF9E");
69        sHalfWidthMap.put('\u3063', "\uFF6F");
70        sHalfWidthMap.put('\u3064', "\uFF82");
71        sHalfWidthMap.put('\u3065', "\uFF82\uFF9E");
72        sHalfWidthMap.put('\u3066', "\uFF83");
73        sHalfWidthMap.put('\u3067', "\uFF83\uFF9E");
74        sHalfWidthMap.put('\u3068', "\uFF84");
75        sHalfWidthMap.put('\u3069', "\uFF84\uFF9E");
76        sHalfWidthMap.put('\u306A', "\uFF85");
77        sHalfWidthMap.put('\u306B', "\uFF86");
78        sHalfWidthMap.put('\u306C', "\uFF87");
79        sHalfWidthMap.put('\u306D', "\uFF88");
80        sHalfWidthMap.put('\u306E', "\uFF89");
81        sHalfWidthMap.put('\u306F', "\uFF8A");
82        sHalfWidthMap.put('\u3070', "\uFF8A\uFF9E");
83        sHalfWidthMap.put('\u3071', "\uFF8A\uFF9F");
84        sHalfWidthMap.put('\u3072', "\uFF8B");
85        sHalfWidthMap.put('\u3073', "\uFF8B\uFF9E");
86        sHalfWidthMap.put('\u3074', "\uFF8B\uFF9F");
87        sHalfWidthMap.put('\u3075', "\uFF8C");
88        sHalfWidthMap.put('\u3076', "\uFF8C\uFF9E");
89        sHalfWidthMap.put('\u3077', "\uFF8C\uFF9F");
90        sHalfWidthMap.put('\u3078', "\uFF8D");
91        sHalfWidthMap.put('\u3079', "\uFF8D\uFF9E");
92        sHalfWidthMap.put('\u307A', "\uFF8D\uFF9F");
93        sHalfWidthMap.put('\u307B', "\uFF8E");
94        sHalfWidthMap.put('\u307C', "\uFF8E\uFF9E");
95        sHalfWidthMap.put('\u307D', "\uFF8E\uFF9F");
96        sHalfWidthMap.put('\u307E', "\uFF8F");
97        sHalfWidthMap.put('\u307F', "\uFF90");
98        sHalfWidthMap.put('\u3080', "\uFF91");
99        sHalfWidthMap.put('\u3081', "\uFF92");
100        sHalfWidthMap.put('\u3082', "\uFF93");
101        sHalfWidthMap.put('\u3083', "\uFF6C");
102        sHalfWidthMap.put('\u3084', "\uFF94");
103        sHalfWidthMap.put('\u3085', "\uFF6D");
104        sHalfWidthMap.put('\u3086', "\uFF95");
105        sHalfWidthMap.put('\u3087', "\uFF6E");
106        sHalfWidthMap.put('\u3088', "\uFF96");
107        sHalfWidthMap.put('\u3089', "\uFF97");
108        sHalfWidthMap.put('\u308A', "\uFF98");
109        sHalfWidthMap.put('\u308B', "\uFF99");
110        sHalfWidthMap.put('\u308C', "\uFF9A");
111        sHalfWidthMap.put('\u308D', "\uFF9B");
112        sHalfWidthMap.put('\u308E', "\uFF9C");
113        sHalfWidthMap.put('\u308F', "\uFF9C");
114        sHalfWidthMap.put('\u3090', "\uFF72");
115        sHalfWidthMap.put('\u3091', "\uFF74");
116        sHalfWidthMap.put('\u3092', "\uFF66");
117        sHalfWidthMap.put('\u3093', "\uFF9D");
118        sHalfWidthMap.put('\u309B', "\uFF9E");
119        sHalfWidthMap.put('\u309C', "\uFF9F");
120        sHalfWidthMap.put('\u30A1', "\uFF67");
121        sHalfWidthMap.put('\u30A2', "\uFF71");
122        sHalfWidthMap.put('\u30A3', "\uFF68");
123        sHalfWidthMap.put('\u30A4', "\uFF72");
124        sHalfWidthMap.put('\u30A5', "\uFF69");
125        sHalfWidthMap.put('\u30A6', "\uFF73");
126        sHalfWidthMap.put('\u30A7', "\uFF6A");
127        sHalfWidthMap.put('\u30A8', "\uFF74");
128        sHalfWidthMap.put('\u30A9', "\uFF6B");
129        sHalfWidthMap.put('\u30AA', "\uFF75");
130        sHalfWidthMap.put('\u30AB', "\uFF76");
131        sHalfWidthMap.put('\u30AC', "\uFF76\uFF9E");
132        sHalfWidthMap.put('\u30AD', "\uFF77");
133        sHalfWidthMap.put('\u30AE', "\uFF77\uFF9E");
134        sHalfWidthMap.put('\u30AF', "\uFF78");
135        sHalfWidthMap.put('\u30B0', "\uFF78\uFF9E");
136        sHalfWidthMap.put('\u30B1', "\uFF79");
137        sHalfWidthMap.put('\u30B2', "\uFF79\uFF9E");
138        sHalfWidthMap.put('\u30B3', "\uFF7A");
139        sHalfWidthMap.put('\u30B4', "\uFF7A\uFF9E");
140        sHalfWidthMap.put('\u30B5', "\uFF7B");
141        sHalfWidthMap.put('\u30B6', "\uFF7B\uFF9E");
142        sHalfWidthMap.put('\u30B7', "\uFF7C");
143        sHalfWidthMap.put('\u30B8', "\uFF7C\uFF9E");
144        sHalfWidthMap.put('\u30B9', "\uFF7D");
145        sHalfWidthMap.put('\u30BA', "\uFF7D\uFF9E");
146        sHalfWidthMap.put('\u30BB', "\uFF7E");
147        sHalfWidthMap.put('\u30BC', "\uFF7E\uFF9E");
148        sHalfWidthMap.put('\u30BD', "\uFF7F");
149        sHalfWidthMap.put('\u30BE', "\uFF7F\uFF9E");
150        sHalfWidthMap.put('\u30BF', "\uFF80");
151        sHalfWidthMap.put('\u30C0', "\uFF80\uFF9E");
152        sHalfWidthMap.put('\u30C1', "\uFF81");
153        sHalfWidthMap.put('\u30C2', "\uFF81\uFF9E");
154        sHalfWidthMap.put('\u30C3', "\uFF6F");
155        sHalfWidthMap.put('\u30C4', "\uFF82");
156        sHalfWidthMap.put('\u30C5', "\uFF82\uFF9E");
157        sHalfWidthMap.put('\u30C6', "\uFF83");
158        sHalfWidthMap.put('\u30C7', "\uFF83\uFF9E");
159        sHalfWidthMap.put('\u30C8', "\uFF84");
160        sHalfWidthMap.put('\u30C9', "\uFF84\uFF9E");
161        sHalfWidthMap.put('\u30CA', "\uFF85");
162        sHalfWidthMap.put('\u30CB', "\uFF86");
163        sHalfWidthMap.put('\u30CC', "\uFF87");
164        sHalfWidthMap.put('\u30CD', "\uFF88");
165        sHalfWidthMap.put('\u30CE', "\uFF89");
166        sHalfWidthMap.put('\u30CF', "\uFF8A");
167        sHalfWidthMap.put('\u30D0', "\uFF8A\uFF9E");
168        sHalfWidthMap.put('\u30D1', "\uFF8A\uFF9F");
169        sHalfWidthMap.put('\u30D2', "\uFF8B");
170        sHalfWidthMap.put('\u30D3', "\uFF8B\uFF9E");
171        sHalfWidthMap.put('\u30D4', "\uFF8B\uFF9F");
172        sHalfWidthMap.put('\u30D5', "\uFF8C");
173        sHalfWidthMap.put('\u30D6', "\uFF8C\uFF9E");
174        sHalfWidthMap.put('\u30D7', "\uFF8C\uFF9F");
175        sHalfWidthMap.put('\u30D8', "\uFF8D");
176        sHalfWidthMap.put('\u30D9', "\uFF8D\uFF9E");
177        sHalfWidthMap.put('\u30DA', "\uFF8D\uFF9F");
178        sHalfWidthMap.put('\u30DB', "\uFF8E");
179        sHalfWidthMap.put('\u30DC', "\uFF8E\uFF9E");
180        sHalfWidthMap.put('\u30DD', "\uFF8E\uFF9F");
181        sHalfWidthMap.put('\u30DE', "\uFF8F");
182        sHalfWidthMap.put('\u30DF', "\uFF90");
183        sHalfWidthMap.put('\u30E0', "\uFF91");
184        sHalfWidthMap.put('\u30E1', "\uFF92");
185        sHalfWidthMap.put('\u30E2', "\uFF93");
186        sHalfWidthMap.put('\u30E3', "\uFF6C");
187        sHalfWidthMap.put('\u30E4', "\uFF94");
188        sHalfWidthMap.put('\u30E5', "\uFF6D");
189        sHalfWidthMap.put('\u30E6', "\uFF95");
190        sHalfWidthMap.put('\u30E7', "\uFF6E");
191        sHalfWidthMap.put('\u30E8', "\uFF96");
192        sHalfWidthMap.put('\u30E9', "\uFF97");
193        sHalfWidthMap.put('\u30EA', "\uFF98");
194        sHalfWidthMap.put('\u30EB', "\uFF99");
195        sHalfWidthMap.put('\u30EC', "\uFF9A");
196        sHalfWidthMap.put('\u30ED', "\uFF9B");
197        sHalfWidthMap.put('\u30EE', "\uFF9C");
198        sHalfWidthMap.put('\u30EF', "\uFF9C");
199        sHalfWidthMap.put('\u30F0', "\uFF72");
200        sHalfWidthMap.put('\u30F1', "\uFF74");
201        sHalfWidthMap.put('\u30F2', "\uFF66");
202        sHalfWidthMap.put('\u30F3', "\uFF9D");
203        sHalfWidthMap.put('\u30F4', "\uFF73\uFF9E");
204        sHalfWidthMap.put('\u30F5', "\uFF76");
205        sHalfWidthMap.put('\u30F6', "\uFF79");
206        sHalfWidthMap.put('\u30FB', "\uFF65");
207        sHalfWidthMap.put('\u30FC', "\uFF70");
208        sHalfWidthMap.put('\uFF01', "!");
209        sHalfWidthMap.put('\uFF02', "\"");
210        sHalfWidthMap.put('\uFF03', "#");
211        sHalfWidthMap.put('\uFF04', "$");
212        sHalfWidthMap.put('\uFF05', "%");
213        sHalfWidthMap.put('\uFF06', "&");
214        sHalfWidthMap.put('\uFF07', "'");
215        sHalfWidthMap.put('\uFF08', "(");
216        sHalfWidthMap.put('\uFF09', ")");
217        sHalfWidthMap.put('\uFF0A', "*");
218        sHalfWidthMap.put('\uFF0B', "+");
219        sHalfWidthMap.put('\uFF0C', ",");
220        sHalfWidthMap.put('\uFF0D', "-");
221        sHalfWidthMap.put('\uFF0E', ".");
222        sHalfWidthMap.put('\uFF0F', "/");
223        sHalfWidthMap.put('\uFF10', "0");
224        sHalfWidthMap.put('\uFF11', "1");
225        sHalfWidthMap.put('\uFF12', "2");
226        sHalfWidthMap.put('\uFF13', "3");
227        sHalfWidthMap.put('\uFF14', "4");
228        sHalfWidthMap.put('\uFF15', "5");
229        sHalfWidthMap.put('\uFF16', "6");
230        sHalfWidthMap.put('\uFF17', "7");
231        sHalfWidthMap.put('\uFF18', "8");
232        sHalfWidthMap.put('\uFF19', "9");
233        sHalfWidthMap.put('\uFF1A', ":");
234        sHalfWidthMap.put('\uFF1B', ";");
235        sHalfWidthMap.put('\uFF1C', "<");
236        sHalfWidthMap.put('\uFF1D', "=");
237        sHalfWidthMap.put('\uFF1E', ">");
238        sHalfWidthMap.put('\uFF1F', "?");
239        sHalfWidthMap.put('\uFF20', "@");
240        sHalfWidthMap.put('\uFF21', "A");
241        sHalfWidthMap.put('\uFF22', "B");
242        sHalfWidthMap.put('\uFF23', "C");
243        sHalfWidthMap.put('\uFF24', "D");
244        sHalfWidthMap.put('\uFF25', "E");
245        sHalfWidthMap.put('\uFF26', "F");
246        sHalfWidthMap.put('\uFF27', "G");
247        sHalfWidthMap.put('\uFF28', "H");
248        sHalfWidthMap.put('\uFF29', "I");
249        sHalfWidthMap.put('\uFF2A', "J");
250        sHalfWidthMap.put('\uFF2B', "K");
251        sHalfWidthMap.put('\uFF2C', "L");
252        sHalfWidthMap.put('\uFF2D', "M");
253        sHalfWidthMap.put('\uFF2E', "N");
254        sHalfWidthMap.put('\uFF2F', "O");
255        sHalfWidthMap.put('\uFF30', "P");
256        sHalfWidthMap.put('\uFF31', "Q");
257        sHalfWidthMap.put('\uFF32', "R");
258        sHalfWidthMap.put('\uFF33', "S");
259        sHalfWidthMap.put('\uFF34', "T");
260        sHalfWidthMap.put('\uFF35', "U");
261        sHalfWidthMap.put('\uFF36', "V");
262        sHalfWidthMap.put('\uFF37', "W");
263        sHalfWidthMap.put('\uFF38', "X");
264        sHalfWidthMap.put('\uFF39', "Y");
265        sHalfWidthMap.put('\uFF3A', "Z");
266        sHalfWidthMap.put('\uFF3B', "[");
267        sHalfWidthMap.put('\uFF3C', "\\");
268        sHalfWidthMap.put('\uFF3D', "]");
269        sHalfWidthMap.put('\uFF3E', "^");
270        sHalfWidthMap.put('\uFF3F', "_");
271        sHalfWidthMap.put('\uFF41', "a");
272        sHalfWidthMap.put('\uFF42', "b");
273        sHalfWidthMap.put('\uFF43', "c");
274        sHalfWidthMap.put('\uFF44', "d");
275        sHalfWidthMap.put('\uFF45', "e");
276        sHalfWidthMap.put('\uFF46', "f");
277        sHalfWidthMap.put('\uFF47', "g");
278        sHalfWidthMap.put('\uFF48', "h");
279        sHalfWidthMap.put('\uFF49', "i");
280        sHalfWidthMap.put('\uFF4A', "j");
281        sHalfWidthMap.put('\uFF4B', "k");
282        sHalfWidthMap.put('\uFF4C', "l");
283        sHalfWidthMap.put('\uFF4D', "m");
284        sHalfWidthMap.put('\uFF4E', "n");
285        sHalfWidthMap.put('\uFF4F', "o");
286        sHalfWidthMap.put('\uFF50', "p");
287        sHalfWidthMap.put('\uFF51', "q");
288        sHalfWidthMap.put('\uFF52', "r");
289        sHalfWidthMap.put('\uFF53', "s");
290        sHalfWidthMap.put('\uFF54', "t");
291        sHalfWidthMap.put('\uFF55', "u");
292        sHalfWidthMap.put('\uFF56', "v");
293        sHalfWidthMap.put('\uFF57', "w");
294        sHalfWidthMap.put('\uFF58', "x");
295        sHalfWidthMap.put('\uFF59', "y");
296        sHalfWidthMap.put('\uFF5A', "z");
297        sHalfWidthMap.put('\uFF5B', "{");
298        sHalfWidthMap.put('\uFF5C', "|");
299        sHalfWidthMap.put('\uFF5D', "}");
300        sHalfWidthMap.put('\uFF5E', "~");
301        sHalfWidthMap.put('\uFF61', "\uFF61");
302        sHalfWidthMap.put('\uFF62', "\uFF62");
303        sHalfWidthMap.put('\uFF63', "\uFF63");
304        sHalfWidthMap.put('\uFF64', "\uFF64");
305        sHalfWidthMap.put('\uFF65', "\uFF65");
306        sHalfWidthMap.put('\uFF66', "\uFF66");
307        sHalfWidthMap.put('\uFF67', "\uFF67");
308        sHalfWidthMap.put('\uFF68', "\uFF68");
309        sHalfWidthMap.put('\uFF69', "\uFF69");
310        sHalfWidthMap.put('\uFF6A', "\uFF6A");
311        sHalfWidthMap.put('\uFF6B', "\uFF6B");
312        sHalfWidthMap.put('\uFF6C', "\uFF6C");
313        sHalfWidthMap.put('\uFF6D', "\uFF6D");
314        sHalfWidthMap.put('\uFF6E', "\uFF6E");
315        sHalfWidthMap.put('\uFF6F', "\uFF6F");
316        sHalfWidthMap.put('\uFF70', "\uFF70");
317        sHalfWidthMap.put('\uFF71', "\uFF71");
318        sHalfWidthMap.put('\uFF72', "\uFF72");
319        sHalfWidthMap.put('\uFF73', "\uFF73");
320        sHalfWidthMap.put('\uFF74', "\uFF74");
321        sHalfWidthMap.put('\uFF75', "\uFF75");
322        sHalfWidthMap.put('\uFF76', "\uFF76");
323        sHalfWidthMap.put('\uFF77', "\uFF77");
324        sHalfWidthMap.put('\uFF78', "\uFF78");
325        sHalfWidthMap.put('\uFF79', "\uFF79");
326        sHalfWidthMap.put('\uFF7A', "\uFF7A");
327        sHalfWidthMap.put('\uFF7B', "\uFF7B");
328        sHalfWidthMap.put('\uFF7C', "\uFF7C");
329        sHalfWidthMap.put('\uFF7D', "\uFF7D");
330        sHalfWidthMap.put('\uFF7E', "\uFF7E");
331        sHalfWidthMap.put('\uFF7F', "\uFF7F");
332        sHalfWidthMap.put('\uFF80', "\uFF80");
333        sHalfWidthMap.put('\uFF81', "\uFF81");
334        sHalfWidthMap.put('\uFF82', "\uFF82");
335        sHalfWidthMap.put('\uFF83', "\uFF83");
336        sHalfWidthMap.put('\uFF84', "\uFF84");
337        sHalfWidthMap.put('\uFF85', "\uFF85");
338        sHalfWidthMap.put('\uFF86', "\uFF86");
339        sHalfWidthMap.put('\uFF87', "\uFF87");
340        sHalfWidthMap.put('\uFF88', "\uFF88");
341        sHalfWidthMap.put('\uFF89', "\uFF89");
342        sHalfWidthMap.put('\uFF8A', "\uFF8A");
343        sHalfWidthMap.put('\uFF8B', "\uFF8B");
344        sHalfWidthMap.put('\uFF8C', "\uFF8C");
345        sHalfWidthMap.put('\uFF8D', "\uFF8D");
346        sHalfWidthMap.put('\uFF8E', "\uFF8E");
347        sHalfWidthMap.put('\uFF8F', "\uFF8F");
348        sHalfWidthMap.put('\uFF90', "\uFF90");
349        sHalfWidthMap.put('\uFF91', "\uFF91");
350        sHalfWidthMap.put('\uFF92', "\uFF92");
351        sHalfWidthMap.put('\uFF93', "\uFF93");
352        sHalfWidthMap.put('\uFF94', "\uFF94");
353        sHalfWidthMap.put('\uFF95', "\uFF95");
354        sHalfWidthMap.put('\uFF96', "\uFF96");
355        sHalfWidthMap.put('\uFF97', "\uFF97");
356        sHalfWidthMap.put('\uFF98', "\uFF98");
357        sHalfWidthMap.put('\uFF99', "\uFF99");
358        sHalfWidthMap.put('\uFF9A', "\uFF9A");
359        sHalfWidthMap.put('\uFF9B', "\uFF9B");
360        sHalfWidthMap.put('\uFF9C', "\uFF9C");
361        sHalfWidthMap.put('\uFF9D', "\uFF9D");
362        sHalfWidthMap.put('\uFF9E', "\uFF9E");
363        sHalfWidthMap.put('\uFF9F', "\uFF9F");
364        sHalfWidthMap.put('\uFFE5', "\u005C\u005C");
365    }
366
367    /**
368     * Returns half-width version of that character if possible. Returns null if not possible
369     * @param ch input character
370     * @return CharSequence object if the mapping for ch exists. Return null otherwise.
371     */
372    public static String tryGetHalfWidthText(final char ch) {
373        if (sHalfWidthMap.containsKey(ch)) {
374            return sHalfWidthMap.get(ch);
375        } else {
376            return null;
377        }
378    }
379}
380