1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - WM - demos - dataShare-Model
3   File:     unicode.c
4 
5   Copyright 2006-2008 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-09-18#$
14   $Rev: 8573 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 
18 #ifdef SDK_TWL
19 #include <twl.h>
20 #else
21 #include <nitro.h>
22 #endif
23 #include "unicode.h"
24 
25 // Define data------------------------------------------
26 #define TBL8140_ELEM_NUM				0xbd    // Number of elements in the 8140tbl
27 #define TBL849f_ELEM_NUM				0x20    // Number of elements in the 849ftbl
28 
29         // Value for determining SJIS codes
30 #define SJIS_HIGHER_CODE1_MIN			0x81
31 #define SJIS_HIGHER_CODE1_MAX			0x9f
32 #define SJIS_HIGHER_CODE2_MIN			0xe0
33 #define SJIS_HIGHER_CODE2_MAX			0xea
34 
35 typedef struct SjisUtf16Pare
36 {
37     u16     sjis;
38     u16     unicode;
39 }
40 SjisUtf16Pare;
41 
42 // Extern data------------------------------------------
43 
44 // Function's prototype declaration---------------------
45 static u16 SearchUnicodeTable(u16 unicode, SjisUtf16Pare * tblp, int elem_num);
46 
47 // Global variable -------------------------------------
48 
49 // Static variable -------------------------------------
50 
51 // Const data  -----------------------------------------
52 static const SjisUtf16Pare tblSJIS_UTF16_8140[TBL8140_ELEM_NUM];
53 static const SjisUtf16Pare tblSJIS_UTF16_849f[TBL849f_ELEM_NUM];
54 
55 
56 //======================================================
57 // Conversion from SJIS-BE to UTF16-LE
58 //======================================================
ExSJIS_BEtoUTF16_LE(u8 * sjisp,u16 * unip,u16 length)59 void ExSJIS_BEtoUTF16_LE(u8 *sjisp, u16 *unip, u16 length)
60 {
61     u16     code;
62 
63     while ((*sjisp) && (length-- > 0))
64     {
65         if (((*sjisp >= SJIS_HIGHER_CODE1_MIN) && (*sjisp <= SJIS_HIGHER_CODE1_MAX))
66             || ((*sjisp >= SJIS_HIGHER_CODE2_MIN) && (*sjisp <= SJIS_HIGHER_CODE2_MAX)))
67         {                              // Is it SJIS?
68             code = (u16)((u16)*sjisp++ << 8);
69             code |= (u16)*sjisp++;
70         }
71         else
72         {                              // ASCII
73             code = (u16)*sjisp++;
74         }
75 
76         if (code == 0x005c)
77         {
78             *unip = 0x00a5;            // \
79 
80         }
81         else if (code == 0x007e)
82         {
83             *unip = 0x203e;            // ~
84 
85         }
86         else if ((code == 0x000d) || (code == 0x000a))
87         {
88             *unip = code;              // Line feed code
89 
90         }
91         else if ((code >= 0x0020) && (code < 0x007e))   // ' ' �` }
92         {
93             *unip = code;
94 
95         }
96         else if ((code >= 0x00a1) && (code <= 0x00df))  // Double-byte period, tilde, and degree symbol
97         {
98             *unip = (u16)((code - 0x00a1) + 0xff61);
99 
100         }
101         else if ((code >= 0x8140) && (code <= 0x81fc))  // '  ' �` ��
102         {
103             // Scattered, so look up in the table
104             *unip = tblSJIS_UTF16_8140[code - 0x8140].unicode;
105 
106         }
107         else if ((code >= 0x824f) && (code <= 0x8258))  // �O �` �X
108         {
109             *unip = (u16)((code - 0x824f) + 0xff10);
110 
111         }
112         else if ((code >= 0x8260) && (code <= 0x8279))  // �` �` �y
113         {
114             *unip = (u16)((code - 0x8260) + 0xff21);
115 
116         }
117         else if ((code >= 0x8281) && (code <= 0x829a))  // �� �` ��
118         {
119             *unip = (u16)((code - 0x8281) + 0xff41);
120 
121         }
122         else if ((code >= 0x829f) && (code <= 0x82f1))  // �� �` ��
123         {
124             *unip = (u16)((code - 0x829f) + 0x3041);
125 
126         }
127         else if ((code >= 0x8340) && (code <= 0x8396))  // �@ �` ��  * 0x837f is skipped
128         {
129             *unip = (u16)((code - 0x8340) + 0x30a1);
130             if (code == 0x837f)
131             {
132                 *unip = 0x3000;
133             }
134             else if (code > 0x837f)
135             {
136                 (*unip)--;
137             }
138 
139         }
140         else if ((code >= 0x839f) && (code <= 0x83b6))  // �� �` ��
141         {
142             *unip = (u16)((code - 0x839f) + 0x0391);
143             if (code >= 0x83b0)
144                 (*unip)++;
145 
146         }
147         else if ((code >= 0x83bf) && (code <= 0x83d6))  // �� �` ��
148         {
149             *unip = (u16)((code - 0x83bf) + 0x03b1);
150             if (code >= 0x83d0)
151                 (*unip)++;
152 
153         }
154         else if ((code >= 0x8440) && (code <= 0x8460))  // �@ �` �`
155         {
156             *unip = (u16)((code - 0x8440) + 0x0410);
157             if (code == 0x8446)
158             {
159                 *unip = 0x0401;
160             }
161             else if (code > 0x8446)
162             {
163                 (*unip)--;
164             }
165 
166         }
167         else if ((code >= 0x8470) && (code <= 0x8491))  // �p �` �� * 0x847f is skipped
168         {
169             *unip = (u16)((code - 0x8470) + 0x0430);
170             if (code == 0x8476)
171             {
172                 *unip = 0x0451;
173             }
174             else if (code == 0x847f)
175             {
176                 *unip = 0x3000;
177             }
178             else if (code > 0x8476)
179             {
180                 (*unip)--;
181                 if (code > 0x847f)
182                 {
183                     (*unip)--;
184                 }
185             }
186 
187         }
188         else if ((code >= 0x849f) && (code <= 0x84be))  // �� �` ��
189         {
190             // Scattered, so look up in the table
191             *unip = tblSJIS_UTF16_849f[code - 0x849f].unicode;
192         }
193         else
194         {
195             *unip = 0x3000;
196         }
197 
198         unip++;
199     }
200 }
201 
202 
203 //======================================================
204 // Conversion from UTF16-LE to SJIS-BE
205 //======================================================
ExUTF16_LEtoSJIS_BE(u8 * sjisp,u16 * unip,u16 length)206 void ExUTF16_LEtoSJIS_BE(u8 *sjisp, u16 *unip, u16 length)
207 {
208     u16     code, sjis_le;
209 
210     while ((*unip) && (length-- > 0))
211     {
212         code = *unip++;
213         sjis_le = 0;
214 
215         if (code == 0x00a5)
216         {
217             sjis_le = 0x005c;          // \
218 
219         }
220         else if (code == 0x005c)
221         {
222             sjis_le = 0x815f;          // �_
223 
224         }
225         else if (code == 0x203e)
226         {
227             sjis_le = 0x007e;          // ~
228 
229         }
230         else if ((code == 0x000d) || (code == 0x000a))
231         {
232             sjis_le = code;            // Line feed code
233 
234         }
235         else if ((code >= 0x0020) && (code < 0x007e))   // ' ' �` }
236         {
237             sjis_le = code;
238 
239         }
240         else if ((code >= 0x00a2) && (code <= 0x00f7))
241         {                              // Unicode codes 0x00a2 to 0x00f7 are located in SJIS 0x814c to 0x81f7
242             sjis_le =
243                 SearchUnicodeTable(code, (SjisUtf16Pare *) & tblSJIS_UTF16_8140[0xc],
244                                    0x81f7 - 0x814c);
245 
246         }
247         else if ((code >= 0xff61) && (code <= 0xff9f))  // � �` �
248         {
249             sjis_le = (u16)((code - 0xff61) + 0x00a1);
250 
251         }
252         else if (code == 0x4edd)
253         {
254             sjis_le = 0x8157;
255 
256         }
257         else if ((code >= 0xff01) && (code <= 0xffe5))
258         {
259             if ((code >= 0xff10) && (code <= 0xff19))   // �O �` �X
260             {
261                 sjis_le = (u16)((code - 0xff10) + 0x824f);
262 
263             }
264             else if ((code >= 0xff21) && (code <= 0xff3a))      // �` �` �y
265             {
266                 sjis_le = (u16)((code - 0xff21) + 0x8260);
267 
268             }
269             else if ((code >= 0xff41) && (code <= 0xff5a))      // �� �` ��
270             {
271                 sjis_le = (u16)((code - 0xff41) + 0x8281);
272             }
273             else
274             {                          // Unicode codes 0xff01 to 0xffe5 are located in SJIS 0x8143 to 0x8197
275                 sjis_le =
276                     SearchUnicodeTable(code, (SjisUtf16Pare *) & tblSJIS_UTF16_8140[3],
277                                        0x8197 - 0x8143);
278             }
279 
280         }
281         else if ((code >= 0x3000) && (code <= 0x30fe))
282         {
283             if ((code >= 0x3041) && (code <= 0x3093))   // �� �` ��
284             {
285                 sjis_le = (u16)((code - 0x3041) + 0x829f);
286 
287             }
288             else if ((code >= 0x30a1) && (code <= 0x30f6))      // �@ �` ��  * 0x837f is skipped
289             {
290                 sjis_le = (u16)((code - 0x30a1) + 0x8340);
291                 if (code >= 0x30e0)
292                 {
293                     (sjis_le)++;
294                 }
295             }
296             else
297             {                          // Unicode codes 0x3000 to 0x30fe are located in SJIS 0x8140 to 0x81ac
298                 sjis_le =
299                     SearchUnicodeTable(code, (SjisUtf16Pare *) & tblSJIS_UTF16_8140[0],
300                                        0x81ac - 0x8140);
301             }
302 
303         }
304         else if ((code >= 0x0391) && (code <= 0x03a9))  // �� �` ��
305         {
306             sjis_le = (u16)((code - 0x0391) + 0x839f);
307             if (code >= 0x03a3)
308                 (sjis_le)--;
309 
310         }
311         else if ((code >= 0x03b1) && (code <= 0x03c9))  // �� �` ��
312         {
313             sjis_le = (u16)((code - 0x03b1) + 0x83bf);
314             if (code >= 0x03c3)
315                 (sjis_le)--;
316 
317         }
318         else if (code == 0x0401)
319         {
320             sjis_le = 0x8446;
321 
322         }
323         else if ((code >= 0x0410) && (code <= 0x042f))  // �@ �` �`
324         {
325             sjis_le = (u16)((code - 0x0410) + 0x8440);
326             if (code >= 0x0416)
327             {
328                 (sjis_le)++;
329             }
330 
331         }
332         else if ((code >= 0x0430) && (code <= 0x044f))  // �p �` �� * 0x847f is skipped
333         {
334             sjis_le = (u16)((code - 0x0430) + 0x8470);
335             if (code >= 0x0436)
336             {
337                 (sjis_le)++;
338                 if (code >= 0x043e)
339                 {
340                     (sjis_le)++;
341                 }
342             }
343 
344         }
345         else if (code == 0x0451)
346         {
347             sjis_le = 0x8476;
348 
349         }
350         else if ((code >= 0x2500) && (code <= 0x254b))  // �� �` ��
351         {
352             sjis_le =
353                 SearchUnicodeTable(code, (SjisUtf16Pare *) & tblSJIS_UTF16_849f, TBL849f_ELEM_NUM);
354 
355         }
356         else if (((code >= 0x2010) && (code <= 0x2312)) || ((code >= 0x25a0) && (code <= 0x266f)))
357         {                              // The abovementioned codes are located in SJIS 0x815c to 0x81fc
358             sjis_le =
359                 SearchUnicodeTable(code, (SjisUtf16Pare *) & tblSJIS_UTF16_8140[0x815c - 0x8140],
360                                    0x81fc - 0x815c);
361 
362         }
363         else
364         {
365             sjis_le = 0x8140;
366         }
367 
368         // Stores the converted SJIS codes in the buffer
369         if (sjis_le & 0xff00)
370         {                              // If not ASCII codes, stores in Big Endian format
371             *sjisp++ = (u8)(sjis_le >> 8);
372         }
373         *sjisp++ = (u8)(sjis_le);
374     }
375 }
376 
377 
378 // Table lookup from Unicode -> SJIS
SearchUnicodeTable(u16 unicode,SjisUtf16Pare * tblp,int elem_num)379 static u16 SearchUnicodeTable(u16 unicode, SjisUtf16Pare * tblp, int elem_num)
380 {
381     elem_num++;
382     while (elem_num--)
383     {
384         if (tblp->unicode == unicode)
385         {
386             return tblp->sjis;
387         }
388         tblp++;
389     }
390     return 0x8140;
391 }
392 
393 
394 //======================================================
395 // Check SJIS-BE <-> UTF16-LE conversions
396 //======================================================
CheckSJIS_BEtoUTF16_LE(void)397 void CheckSJIS_BEtoUTF16_LE(void)
398 {
399     u16     sjis, sjis_be, rev_sjis, sjis_le;
400     u16     unicode;
401 
402     // Checks ASCII codes
403     for (sjis = 0; sjis < 0x00ff; sjis++)
404     {
405         unicode = 0;
406         rev_sjis = 0;
407         ExSJIS_BEtoUTF16_LE((u8 *)&sjis, &unicode, 1);
408         ExUTF16_LEtoSJIS_BE((u8 *)&rev_sjis, &unicode, 1);
409         sjis_le = (u16)((rev_sjis >> 8) | (rev_sjis << 8));
410         OS_Printf("0x%x\t-> 0x%x\t-> 0x%x\n", sjis, unicode, sjis_le);
411     }
412 
413     // Checks SJIS codes
414     for (sjis = 0x8140; sjis < 0x84ff; sjis++)
415     {
416         unicode = 0;
417         rev_sjis = 0;
418         sjis_be = (u16)((sjis >> 8) | (sjis << 8));
419         ExSJIS_BEtoUTF16_LE((u8 *)&sjis_be, &unicode, 1);
420         ExUTF16_LEtoSJIS_BE((u8 *)&rev_sjis, &unicode, 1);
421         sjis_le = (u16)((rev_sjis >> 8) | (rev_sjis << 8));
422         OS_Printf("0x%x\t-> 0x%x\t-> 0x%x\n", sjis, unicode, sjis_le);
423     }
424 }
425 
426 
427 //======================================================
428 // SJIS code -> Unicode table
429 //======================================================
430 
431 // 0x8140-
432 static const SjisUtf16Pare tblSJIS_UTF16_8140[TBL8140_ELEM_NUM] = {
433     {0x8140, 0x3000},                  //
434     {0x8141, 0x3001},                  // �A
435     {0x8142, 0x3002},                  // �B
436     {0x8143, 0xFF0C},                  // �C
437     {0x8144, 0xFF0E},                  // �D
438     {0x8145, 0x30FB},                  // �E
439     {0x8146, 0xFF1A},                  // :
440     {0x8147, 0xFF1B},                  // �G
441     {0x8148, 0xFF1F},                  // �H
442     {0x8149, 0xFF01},                  // �I
443     {0x814A, 0x309B},                  // �J
444     {0x814B, 0x309C},                  // �K
445     {0x814C, 0x00B4},                  // �L
446     {0x814D, 0xFF40},                  // �M
447     {0x814E, 0x00A8},                  // �N
448     {0x814F, 0xFF3E},                  // �O
449     {0x8150, 0xFFE3},                  // �P
450     {0x8151, 0xFF3F},                  // �Q
451     {0x8152, 0x30FD},                  // �R
452     {0x8153, 0x30FE},                  // �S
453     {0x8154, 0x309D},                  // �T
454     {0x8155, 0x309E},                  // �U
455     {0x8156, 0x3003},                  // �V
456     {0x8157, 0x4EDD},                  // �W
457     {0x8158, 0x3005},                  // �X
458     {0x8159, 0x3006},                  // �Y
459     {0x815A, 0x3007},                  // �Z
460     {0x815B, 0x30FC},                  // �[
461     {0x815C, 0x2015},                  // �\
462     {0x815D, 0x2010},                  // -
463     {0x815E, 0xFF0F},                  // �^
464     {0x815F, 0x005C},                  // �_
465     {0x8160, 0x301C},                  // �`
466     {0x8161, 0x2016},                  // �a
467     {0x8162, 0xFF5C},                  // �b
468     {0x8163, 0x2026},                  // �c
469     {0x8164, 0x2025},                  // �d
470     {0x8165, 0x2018},                  // �e
471     {0x8166, 0x2019},                  // �f
472     {0x8167, 0x201C},                  // �g
473     {0x8168, 0x201D},                  // �h
474     {0x8169, 0xFF08},                  // �i
475     {0x816A, 0xFF09},                  // �j
476     {0x816B, 0x3014},                  // �k
477     {0x816C, 0x3015},                  // �l
478     {0x816D, 0xFF3B},                  // �m
479     {0x816E, 0xFF3D},                  // �n
480     {0x816F, 0xFF5B},                  // �o
481     {0x8170, 0xFF5D},                  // �p
482     {0x8171, 0x3008},                  // �q
483     {0x8172, 0x3009},                  // �r
484     {0x8173, 0x300A},                  // �s
485     {0x8174, 0x300B},                  // �t
486     {0x8175, 0x300C},                  // �u
487     {0x8176, 0x300D},                  // �v
488     {0x8177, 0x300E},                  // �w
489     {0x8178, 0x300F},                  // �x
490     {0x8179, 0x3010},                  // �y
491     {0x817A, 0x3011},                  // �z
492     {0x817B, 0xFF0B},                  // �{
493     {0x817C, 0x2212},                  // �|
494     {0x817D, 0x00B1},                  // �}
495     {0x817E, 0x00D7},                  // �~
496     {0x817F, 0x3000},                  //
497     {0x8180, 0x00F7},                  // ��
498     {0x8181, 0xFF1D},                  // ��
499     {0x8182, 0x2260},                  // ��
500     {0x8183, 0xFF1C},                  // ��
501     {0x8184, 0xFF1E},                  // ��
502     {0x8185, 0x2266},                  // ��
503     {0x8186, 0x2267},                  // ��
504     {0x8187, 0x221E},                  // ��
505     {0x8188, 0x2234},                  // ��
506     {0x8189, 0x2642},                  // ��
507     {0x818A, 0x2640},                  // ��
508     {0x818B, 0x00B0},                  // ��
509     {0x818C, 0x2032},                  // ��
510     {0x818D, 0x2033},                  // ��
511     {0x818E, 0x2103},                  // ��
512     {0x818F, 0xFFE5},                  // ��
513     {0x8190, 0xFF04},                  // ��
514     {0x8191, 0x00A2},                  // ��
515     {0x8192, 0x00A3},                  // ��
516     {0x8193, 0xFF05},                  // ��
517     {0x8194, 0xFF03},                  // ��
518     {0x8195, 0xFF06},                  // ��
519     {0x8196, 0xFF0A},                  // ��
520     {0x8197, 0xFF20},                  // ��
521     {0x8198, 0x00A7},                  // ��
522     {0x8199, 0x2606},                  // ��
523     {0x819A, 0x2605},                  // ��
524     {0x819B, 0x25CB},                  // ��
525     {0x819C, 0x25CF},                  // ��
526     {0x819D, 0x25CE},                  // ��
527     {0x819E, 0x25C7},                  // ��
528     {0x819F, 0x25C6},                  // ��
529     {0x81A0, 0x25A1},                  // ��
530     {0x81A1, 0x25A0},                  // ��
531     {0x81A2, 0x25B3},                  // ��
532     {0x81A3, 0x25B2},                  // ��
533     {0x81A4, 0x25BD},                  // ��
534     {0x81A5, 0x25BC},                  // ��
535     {0x81A6, 0x203B},                  // ��
536     {0x81A7, 0x3012},                  // ��
537     {0x81A8, 0x2192},                  // ��
538     {0x81A9, 0x2190},                  // ��
539     {0x81AA, 0x2191},                  // ��
540     {0x81AB, 0x2193},                  // ��
541     {0x81AC, 0x3013},                  // ��
542     {0x81AD, 0x3000},                  //
543     {0x81AE, 0x3000},                  //
544     {0x81AF, 0x3000},                  //
545     {0x81B0, 0x3000},                  //
546     {0x81B1, 0x3000},                  //
547     {0x81B2, 0x3000},                  //
548     {0x81B3, 0x3000},                  //
549     {0x81B4, 0x3000},                  //
550     {0x81B5, 0x3000},                  //
551     {0x81B6, 0x3000},                  //
552     {0x81B7, 0x3000},                  //
553     {0x81B8, 0x2208},                  // ��
554     {0x81B9, 0x220B},                  // ��
555     {0x81BA, 0x2286},                  // ��
556     {0x81BB, 0x2287},                  // ��
557     {0x81BC, 0x2282},                  // ��
558     {0x81BD, 0x2283},                  // ��
559     {0x81BE, 0x222A},                  // ��
560     {0x81BF, 0x2229},                  // ��
561     {0x81C0, 0x3000},                  //
562     {0x81C1, 0x3000},                  //
563     {0x81C2, 0x3000},                  //
564     {0x81C3, 0x3000},                  //
565     {0x81C4, 0x3000},                  //
566     {0x81C5, 0x3000},                  //
567     {0x81C6, 0x3000},                  //
568     {0x81C7, 0x3000},                  //
569     {0x81C8, 0x2227},                  // ��
570     {0x81C9, 0x2228},                  // ��
571     {0x81CA, 0x00AC},                  // ��
572     {0x81CB, 0x21D2},                  // ��
573     {0x81CC, 0x21D4},                  // ��
574     {0x81CD, 0x2200},                  // ��
575     {0x81CE, 0x2203},                  // ��
576     {0x81CF, 0x3000},                  //
577     {0x81D0, 0x3000},                  //
578     {0x81D1, 0x3000},                  //
579     {0x81D2, 0x3000},                  //
580     {0x81D3, 0x3000},                  //
581     {0x81D4, 0x3000},                  //
582     {0x81D5, 0x3000},                  //
583     {0x81D6, 0x3000},                  //
584     {0x81D7, 0x3000},                  //
585     {0x81D8, 0x3000},                  //
586     {0x81D9, 0x3000},                  //
587     {0x81DA, 0x2220},                  // ��
588     {0x81DB, 0x22A5},                  // ��
589     {0x81DC, 0x2312},                  // ��
590     {0x81DD, 0x2202},                  // ��
591     {0x81DE, 0x2207},                  // ��
592     {0x81DF, 0x2261},                  // ��
593     {0x81E0, 0x2252},                  // ��
594     {0x81E1, 0x226A},                  // ��
595     {0x81E2, 0x226B},                  // ��
596     {0x81E3, 0x221A},                  // ��
597     {0x81E4, 0x223D},                  // ��
598     {0x81E5, 0x221D},                  // ��
599     {0x81E6, 0x2235},                  // ��
600     {0x81E7, 0x222B},                  // ��
601     {0x81E8, 0x222C},                  // ��
602     {0x81E9, 0x3000},                  //
603     {0x81EA, 0x3000},                  //
604     {0x81EB, 0x3000},                  //
605     {0x81EC, 0x3000},                  //
606     {0x81EE, 0x3000},                  //
607     {0x81EE, 0x3000},                  //
608     {0x81EF, 0x3000},                  //
609     {0x81F0, 0x212B},                  // ��
610     {0x81F1, 0x2030},                  // ��
611     {0x81F2, 0x266F},                  // ��
612     {0x81F3, 0x266D},                  // ��
613     {0x81F4, 0x266A},                  // ��
614     {0x81F5, 0x2020},                  // ��
615     {0x81F6, 0x2021},                  // ��
616     {0x81F7, 0x00B6},                  // ��
617     {0x81F8, 0x3000},                  //
618     {0x81F9, 0x3000},                  //
619     {0x81FA, 0x3000},                  //
620     {0x81FB, 0x3000},                  //
621     {0x81FC, 0x25EF},                  // ��
622 };
623 
624 
625 // 0x849f -
626 // 0x2500 to 0x254b in Unicode
627 static const SjisUtf16Pare tblSJIS_UTF16_849f[TBL849f_ELEM_NUM] = {
628     {0x849F, 0x2500},                  // ��
629     {0x84A0, 0x2502},                  // ��
630     {0x84A1, 0x250C},                  // ��
631     {0x84A2, 0x2510},                  // ��
632     {0x84A3, 0x2518},                  // ��
633     {0x84A4, 0x2514},                  // ��
634     {0x84A5, 0x251C},                  // ��
635     {0x84A6, 0x252C},                  // ��
636     {0x84A7, 0x2524},                  // ��
637     {0x84A8, 0x2534},                  // ��
638     {0x84A9, 0x253C},                  // ��
639     {0x84AA, 0x2501},                  // ��
640     {0x84AB, 0x2503},                  // ��
641     {0x84AC, 0x250F},                  // ��
642     {0x84AD, 0x2513},                  // ��
643     {0x84AE, 0x251B},                  // ��
644     {0x84AF, 0x2517},                  // ��
645     {0x84B0, 0x2523},                  // ��
646     {0x84B1, 0x2533},                  // ��
647     {0x84B2, 0x252B},                  // ��
648     {0x84B3, 0x253B},                  // ��
649     {0x84B4, 0x254B},                  // ��
650     {0x84B5, 0x2520},                  // ��
651     {0x84B6, 0x252F},                  // ��
652     {0x84B7, 0x2528},                  // ��
653     {0x84B8, 0x2537},                  // ��
654     {0x84B9, 0x253F},                  // ��
655     {0x84BA, 0x251D},                  // ��
656     {0x84BB, 0x2530},                  // ��
657     {0x84BC, 0x2525},                  // ��
658     {0x84BD, 0x2538},                  // ��
659     {0x84BE, 0x2542},                  // ��
660 };
661