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)) // � �` �
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 aforementioned 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}, // �F
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