001 /* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 * 019 */ 020 021 package org.apache.directory.shared.ldap.schema; 022 023 import java.io.IOException; 024 025 import org.apache.directory.shared.ldap.util.StringTools; 026 import org.apache.directory.shared.ldap.util.unicode.InvalidCharacterException; 027 028 /** 029 * 030 * This class implements the 6 steps described in RFC 4518 031 * 032 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> 033 * @version $Rev$, $Date$ 034 */ 035 public class PrepareString 036 { 037 /** A flag used to lowercase chars during the map process */ 038 private static final boolean CASE_SENSITIVE = true; 039 040 /** A flag used to keep casing during the map process */ 041 private static final boolean IGNORE_CASE = false; 042 043 /** All the possible combining marks */ 044 private static final char[][] COMBINING_MARKS = new char[][] 045 { 046 { 0x0300, 0x034F }, { 0x0360, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, 047 { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 }, { 0x05BB, 0x05BC }, { 0x05BF, 0x05BF }, 048 { 0x05C1, 0x05C2 }, { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 }, 049 { 0x06D6, 0x06DC }, { 0x06DE, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, 050 { 0x0711, 0x0711 }, { 0x0730, 0x074A }, { 0x07A6, 0x07B0 }, { 0x0901, 0x0903 }, 051 { 0x093C, 0x093C }, { 0x093E, 0x094F }, { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, 052 { 0x0981, 0x0983 }, { 0x09BC, 0x09BC }, { 0x09BE, 0x09C4 }, { 0x09C7, 0x09C8 }, 053 { 0x09CB, 0x09CD }, { 0x09D7, 0x09D7 }, { 0x09E2, 0x09E3 }, { 0x0A02, 0x0A02 }, 054 { 0x0A3C, 0x0A3C }, { 0x0A3E, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, 055 { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A83 }, { 0x0ABC, 0x0ABC }, { 0x0ABE, 0x0AC5 }, 056 { 0x0AC7, 0x0AC9 }, { 0x0ACB, 0x0ACD }, { 0x0B01, 0x0B03 }, { 0x0B3C, 0x0B3C }, 057 { 0x0B3E, 0x0B43 }, { 0x0B47, 0x0B48 }, { 0x0B4B, 0x0B4D }, { 0x0B56, 0x0B57 }, 058 { 0x0B82, 0x0B82 }, { 0x0BBE, 0x0BC2 }, { 0x0BC6, 0x0BC8 }, { 0x0BCA, 0x0BCD }, 059 { 0x0BD7, 0x0BD7 }, { 0x0C01, 0x0C03 }, { 0x0C3E, 0x0C44 }, { 0x0C46, 0x0C48 }, 060 { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0C82, 0x0C83 }, { 0x0CBE, 0x0CC4 }, 061 { 0x0CC6, 0x0CC8 }, { 0x0CCA, 0x0CCD }, { 0x0CD5, 0x0CD6 }, { 0x0D02, 0x0D03 }, 062 { 0x0D3E, 0x0D43 }, { 0x0D46, 0x0D48 }, { 0x0D4A, 0x0D4D }, { 0x0D57, 0x0D57 }, 063 { 0x0D82, 0x0D83 }, { 0x0DCA, 0x0DCA }, { 0x0DCF, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, 064 { 0x0DD8, 0x0DDF }, { 0x0DF2, 0x0DF3 }, { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, 065 { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, 066 { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, 067 { 0x0F39, 0x0F39 }, { 0x0F3E, 0x0F3F }, { 0x0F71, 0x0F84 }, { 0x0F86, 0x0F87 }, 068 { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102C, 0x1032 }, 069 { 0x1036, 0x1039 }, { 0x1056, 0x1059 }, { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, 070 { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17B4, 0x17D3 }, { 0x180B, 0x180D }, 071 { 0x18A9, 0x18A9 }, { 0x20D0, 0x20EA }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, 072 { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, { 0xFE20, 0xFE23 } 073 }; 074 075 /** 076 * The type of String we have to normalize 077 */ 078 public enum StringType 079 { 080 NOT_STRING, 081 NUMERIC_STRING, 082 CASE_EXACT, 083 CASE_EXACT_IA5, 084 CASE_IGNORE_IA5, 085 CASE_IGNORE_LIST, 086 CASE_IGNORE, 087 DIRECTORY_STRING, 088 TELEPHONE_NUMBER, 089 WORD 090 } 091 092 093 /** 094 * A private constructor, to avoid instance creation of this static class. 095 */ 096 private PrepareString() 097 { 098 // Do nothing 099 } 100 101 102 /** 103 * Tells if a char is a combining mark. 104 * 105 * @param c The char to check 106 * @return <code>true> if the char is a combining mark, false otherwise 107 */ 108 private static boolean isCombiningMark( char c ) 109 { 110 if ( c < COMBINING_MARKS[0][0] ) 111 { 112 return false; 113 } 114 115 for ( char[] interval:COMBINING_MARKS ) 116 { 117 if ( ( c >= interval[0] ) && ( c <= interval[1] ) ) 118 { 119 return true; 120 } 121 } 122 123 return false; 124 } 125 126 /** 127 * 128 * We have to go through 6 steps : 129 * 130 * 1) Transcode 131 * 2) Map 132 * 3) Normalize 133 * 4) Prohibit 134 * 5) Bidi 135 * 6) Insignifiant Character Handling 136 * 137 * The first step is already done, the step (3) is not done. 138 * 139 * @param str The String to normalize 140 * @param type The string type 141 * @return A normalized string. 142 * @throws IOException 143 */ 144 public static String normalize( String str, StringType type ) throws IOException 145 { 146 switch ( type ) 147 { 148 case NUMERIC_STRING : 149 return insignifiantCharNumericString( str ); 150 151 case TELEPHONE_NUMBER : 152 return insignifiantCharTelephoneNumber( str ); 153 154 case CASE_EXACT : 155 case CASE_EXACT_IA5 : 156 case DIRECTORY_STRING : 157 return insignifiantSpacesString( str, CASE_SENSITIVE ); 158 159 case CASE_IGNORE_IA5 : 160 case CASE_IGNORE_LIST : 161 case CASE_IGNORE : 162 return insignifiantSpacesString( str, IGNORE_CASE ); 163 164 case WORD : 165 return str; 166 167 default : 168 return str; 169 170 } 171 } 172 173 /** 174 * Execute the mapping step of the string preparation : 175 * - suppress useless chars 176 * - transform to spaces 177 * - lowercase 178 * 179 * @param c The char to map 180 * @param target The array which will collect the transformed char 181 * @param pos The current position in the target 182 * @param lowerCase A mask to lowercase the char, if necessary 183 * @return The transformed StringBuilder 184 */ 185 private static int map( char c, char[] target, int pos, char lowerCase ) 186 { 187 int start = pos; 188 189 switch ( c ) 190 { 191 case 0x0000: 192 case 0x0001: 193 case 0x0002: 194 case 0x0003: 195 case 0x0004: 196 case 0x0005: 197 case 0x0006: 198 case 0x0007: 199 case 0x0008: 200 break; 201 202 case 0x0009: 203 case 0x000A: 204 case 0x000B: 205 case 0x000C: 206 case 0x000D: 207 target[pos++] = (char)0x20; 208 break; 209 210 case 0x000E: 211 case 0x000F: 212 case 0x0010: 213 case 0x0011: 214 case 0x0012: 215 case 0x0013: 216 case 0x0014: 217 case 0x0015: 218 case 0x0016: 219 case 0x0017: 220 case 0x0018: 221 case 0x0019: 222 case 0x001A: 223 case 0x001B: 224 case 0x001C: 225 case 0x001D: 226 case 0x001E: 227 case 0x001F: 228 break; 229 230 case 0x0041 : 231 case 0x0042 : 232 case 0x0043 : 233 case 0x0044 : 234 case 0x0045 : 235 case 0x0046 : 236 case 0x0047 : 237 case 0x0048 : 238 case 0x0049 : 239 case 0x004A : 240 case 0x004B : 241 case 0x004C : 242 case 0x004D : 243 case 0x004E : 244 case 0x004F : 245 case 0x0050 : 246 case 0x0051 : 247 case 0x0052 : 248 case 0x0053 : 249 case 0x0054 : 250 case 0x0055 : 251 case 0x0056 : 252 case 0x0057 : 253 case 0x0058 : 254 case 0x0059 : 255 case 0x005A : 256 target[pos++] = (char)( c | lowerCase ); 257 break; 258 259 case 0x007F: 260 case 0x0080: 261 case 0x0081: 262 case 0x0082: 263 case 0x0083: 264 case 0x0084: 265 break; 266 267 case 0x0085: 268 target[pos++] = (char)0x20; 269 break; 270 271 case 0x0086: 272 case 0x0087: 273 case 0x0088: 274 case 0x0089: 275 case 0x008A: 276 case 0x008B: 277 case 0x008C: 278 case 0x008D: 279 case 0x008E: 280 case 0x008F: 281 case 0x0090: 282 case 0x0091: 283 case 0x0092: 284 case 0x0093: 285 case 0x0094: 286 case 0x0095: 287 case 0x0096: 288 case 0x0097: 289 case 0x0098: 290 case 0x0099: 291 case 0x009A: 292 case 0x009B: 293 case 0x009C: 294 case 0x009D: 295 case 0x009E: 296 case 0x009F: 297 break; 298 299 case 0x00A0: 300 target[pos++] = (char)0x20; 301 break; 302 303 case 0x00AD: 304 break; 305 306 307 case 0x00B5 : 308 target[pos++] = (char)0x03BC; 309 break; 310 311 case 0x00C0 : 312 case 0x00C1 : 313 case 0x00C2 : 314 case 0x00C3 : 315 case 0x00C4 : 316 case 0x00C5 : 317 case 0x00C6 : 318 case 0x00C7 : 319 case 0x00C8 : 320 case 0x00C9 : 321 case 0x00CA : 322 case 0x00CB : 323 case 0x00CC : 324 case 0x00CD : 325 case 0x00CE : 326 case 0x00CF : 327 case 0x00D0 : 328 case 0x00D1 : 329 case 0x00D2 : 330 case 0x00D3 : 331 case 0x00D4 : 332 case 0x00D5 : 333 case 0x00D6 : 334 case 0x00D8 : 335 case 0x00D9 : 336 case 0x00DA : 337 case 0x00DB : 338 case 0x00DC : 339 case 0x00DD : 340 case 0x00DE : 341 target[pos++] = (char)( c | lowerCase ); 342 break; 343 344 case 0x00DF : 345 target[pos++] = (char)0x0073; 346 target[pos++] = (char)0x0073; 347 break; 348 349 case 0x0100 : 350 target[pos++] = (char)0x0101; 351 break; 352 353 case 0x0102 : 354 target[pos++] = (char)0x0103; 355 break; 356 357 case 0x0104 : 358 target[pos++] = 0x0105; 359 break; 360 361 case 0x0106 : 362 target[pos++] = 0x0107; 363 break; 364 365 case 0x0108 : 366 target[pos++] = 0x0109; 367 break; 368 369 case 0x010A : 370 target[pos++] = 0x010B; 371 break; 372 373 case 0x010C : 374 target[pos++] = 0x010D; 375 break; 376 377 case 0x010E : 378 target[pos++] = 0x010F; 379 break; 380 381 case 0x0110 : 382 target[pos++] = 0x0111; 383 break; 384 385 case 0x0112 : 386 target[pos++] = 0x0113; 387 break; 388 389 case 0x0114 : 390 target[pos++] = 0x0115; 391 break; 392 393 case 0x0116 : 394 target[pos++] = 0x0117; 395 break; 396 397 case 0x0118 : 398 target[pos++] = 0x0119; 399 break; 400 401 case 0x011A : 402 target[pos++] = 0x011B; 403 break; 404 405 case 0x011C : 406 target[pos++] = 0x011D; 407 break; 408 409 case 0x011E : 410 target[pos++] = 0x011F; 411 break; 412 413 case 0x0120 : 414 target[pos++] = 0x0121; 415 break; 416 417 case 0x0122 : 418 target[pos++] = 0x0123; 419 break; 420 421 case 0x0124 : 422 target[pos++] = 0x0125; 423 break; 424 425 case 0x0126 : 426 target[pos++] = 0x0127; 427 break; 428 429 case 0x0128 : 430 target[pos++] = 0x0129; 431 break; 432 433 case 0x012A : 434 target[pos++] = 0x012B; 435 break; 436 437 case 0x012C : 438 target[pos++] = 0x012D; 439 break; 440 441 case 0x012E : 442 target[pos++] = 0x012F; 443 break; 444 445 case 0x0130 : 446 target[pos++] = 0x0069; 447 target[pos++] = 0x0307; 448 break; 449 450 case 0x0132 : 451 target[pos++] = 0x0133; 452 break; 453 454 case 0x0134 : 455 target[pos++] = 0x0135; 456 break; 457 458 case 0x0136 : 459 target[pos++] = 0x0137; 460 break; 461 462 case 0x0139 : 463 target[pos++] = 0x013A; 464 break; 465 466 case 0x013B : 467 target[pos++] = 0x013C; 468 break; 469 470 case 0x013D : 471 target[pos++] = 0x013E; 472 break; 473 474 case 0x013F : 475 target[pos++] = 0x0140; 476 break; 477 478 case 0x0141 : 479 target[pos++] = 0x0142; 480 break; 481 482 case 0x0143 : 483 target[pos++] = 0x0144; 484 break; 485 486 case 0x0145 : 487 target[pos++] = 0x0146; 488 break; 489 490 case 0x0147 : 491 target[pos++] = 0x0148; 492 break; 493 494 case 0x0149 : 495 target[pos++] = 0x02BC; 496 target[pos++] = 0x006E; 497 break; 498 499 case 0x014A : 500 target[pos++] = 0x014B; 501 break; 502 503 case 0x014C : 504 target[pos++] = 0x014D; 505 break; 506 507 case 0x014E : 508 target[pos++] = 0x014F; 509 break; 510 511 case 0x0150 : 512 target[pos++] = 0x0151; 513 break; 514 515 case 0x0152 : 516 target[pos++] = 0x0153; 517 break; 518 519 case 0x0154 : 520 target[pos++] = 0x0155; 521 break; 522 523 case 0x0156 : 524 target[pos++] = 0x0157; 525 break; 526 527 case 0x0158 : 528 target[pos++] = 0x0159; 529 break; 530 531 case 0x015A : 532 target[pos++] = 0x015B; 533 break; 534 535 case 0x015C : 536 target[pos++] = 0x015D; 537 break; 538 539 case 0x015E : 540 target[pos++] = 0x015F; 541 break; 542 543 case 0x0160 : 544 target[pos++] = 0x0161; 545 break; 546 547 case 0x0162 : 548 target[pos++] = 0x0163; 549 break; 550 551 case 0x0164 : 552 target[pos++] = 0x0165; 553 break; 554 555 case 0x0166 : 556 target[pos++] = 0x0167; 557 break; 558 559 case 0x0168 : 560 target[pos++] = 0x0169; 561 break; 562 563 case 0x016A : 564 target[pos++] = 0x016B; 565 break; 566 567 case 0x016C : 568 target[pos++] = 0x016D; 569 break; 570 571 case 0x016E : 572 target[pos++] = 0x016F; 573 break; 574 575 case 0x0170 : 576 target[pos++] = 0x0171; 577 break; 578 579 case 0x0172 : 580 target[pos++] = 0x0173; 581 break; 582 583 case 0x0174 : 584 target[pos++] = 0x0175; 585 break; 586 587 case 0x0176 : 588 target[pos++] = 0x0177; 589 break; 590 591 case 0x0178 : 592 target[pos++] = 0x00FF; 593 break; 594 595 case 0x0179 : 596 target[pos++] = 0x017A; 597 break; 598 599 case 0x017B : 600 target[pos++] = 0x017C; 601 break; 602 603 case 0x017D : 604 target[pos++] = 0x017E; 605 break; 606 607 case 0x017F : 608 target[pos++] = 0x0073; 609 break; 610 611 case 0x0181 : 612 target[pos++] = 0x0253; 613 break; 614 615 case 0x0182 : 616 target[pos++] = 0x0183; 617 break; 618 619 case 0x0184 : 620 target[pos++] = 0x0185; 621 break; 622 623 case 0x0186 : 624 target[pos++] = 0x0254; 625 break; 626 627 case 0x0187 : 628 target[pos++] = 0x0188; 629 break; 630 631 case 0x0189 : 632 target[pos++] = 0x0256; 633 break; 634 635 case 0x018A : 636 target[pos++] = 0x0257; 637 break; 638 639 case 0x018B : 640 target[pos++] = 0x018C; 641 break; 642 643 case 0x018E : 644 target[pos++] = 0x01DD; 645 break; 646 647 case 0x018F : 648 target[pos++] = 0x0259; 649 break; 650 651 case 0x0190 : 652 target[pos++] = 0x025B; 653 break; 654 655 case 0x0191 : 656 target[pos++] = 0x0192; 657 break; 658 659 case 0x0193 : 660 target[pos++] = 0x0260; 661 break; 662 663 case 0x0194 : 664 target[pos++] = 0x0263; 665 break; 666 667 case 0x0196 : 668 target[pos++] = 0x0269; 669 break; 670 671 case 0x0197 : 672 target[pos++] = 0x0268; 673 break; 674 675 case 0x0198 : 676 target[pos++] = 0x0199; 677 break; 678 679 case 0x019C : 680 target[pos++] = 0x026F; 681 break; 682 683 case 0x019D : 684 target[pos++] = 0x0272; 685 break; 686 687 case 0x019F : 688 target[pos++] = 0x0275; 689 break; 690 691 case 0x01A0 : 692 target[pos++] = 0x01A1; 693 break; 694 695 case 0x01A2 : 696 target[pos++] = 0x01A3; 697 break; 698 699 case 0x01A4 : 700 target[pos++] = 0x01A5; 701 break; 702 703 case 0x01A6 : 704 target[pos++] = 0x0280; 705 break; 706 707 case 0x01A7 : 708 target[pos++] = 0x01A8; 709 break; 710 711 case 0x01A9 : 712 target[pos++] = 0x0283; 713 break; 714 715 case 0x01AC : 716 target[pos++] = 0x01AD; 717 break; 718 719 case 0x01AE : 720 target[pos++] = 0x0288; 721 break; 722 723 case 0x01AF : 724 target[pos++] = 0x01B0; 725 break; 726 727 case 0x01B1 : 728 target[pos++] = 0x028A; 729 break; 730 731 case 0x01B2 : 732 target[pos++] = 0x028B; 733 break; 734 735 case 0x01B3 : 736 target[pos++] = 0x01B4; 737 break; 738 739 case 0x01B5 : 740 target[pos++] = 0x01B6; 741 break; 742 743 case 0x01B7 : 744 target[pos++] = 0x0292; 745 break; 746 747 case 0x01B8 : 748 target[pos++] = 0x01B9; 749 break; 750 751 case 0x01BC : 752 target[pos++] = 0x01BD; 753 break; 754 755 case 0x01C4 : 756 target[pos++] = 0x01C6; 757 break; 758 759 case 0x01C5 : 760 target[pos++] = 0x01C6; 761 break; 762 763 case 0x01C7 : 764 target[pos++] = 0x01C9; 765 break; 766 767 case 0x01C8 : 768 target[pos++] = 0x01C9; 769 break; 770 771 case 0x01CA : 772 target[pos++] = 0x01CC; 773 break; 774 775 case 0x01CB : 776 target[pos++] = 0x01CC; 777 break; 778 779 case 0x01CD : 780 target[pos++] = 0x01CE; 781 break; 782 783 case 0x01CF : 784 target[pos++] = 0x01D0; 785 break; 786 787 case 0x01D1 : 788 target[pos++] = 0x01D2; 789 break; 790 791 case 0x01D3 : 792 target[pos++] = 0x01D4; 793 break; 794 795 case 0x01D5 : 796 target[pos++] = 0x01D6; 797 break; 798 799 case 0x01D7 : 800 target[pos++] = 0x01D8; 801 break; 802 803 case 0x01D9 : 804 target[pos++] = 0x01DA; 805 break; 806 807 case 0x01DB : 808 target[pos++] = 0x01DC; 809 break; 810 811 case 0x01DE : 812 target[pos++] = 0x01DF; 813 break; 814 815 case 0x01E0 : 816 target[pos++] = 0x01E1; 817 break; 818 819 case 0x01E2 : 820 target[pos++] = 0x01E3; 821 break; 822 823 case 0x01E4 : 824 target[pos++] = 0x01E5; 825 break; 826 827 case 0x01E6 : 828 target[pos++] = 0x01E7; 829 break; 830 831 case 0x01E8 : 832 target[pos++] = 0x01E9; 833 break; 834 835 case 0x01EA : 836 target[pos++] = 0x01EB; 837 break; 838 839 case 0x01EC : 840 target[pos++] = 0x01ED; 841 break; 842 843 case 0x01EE : 844 target[pos++] = 0x01EF; 845 break; 846 847 case 0x01F0 : 848 target[pos++] = 0x006A; 849 target[pos++] = 0x030C; 850 break; 851 852 case 0x01F1 : 853 target[pos++] = 0x01F3; 854 break; 855 856 case 0x01F2 : 857 target[pos++] = 0x01F3; 858 break; 859 860 case 0x01F4 : 861 target[pos++] = 0x01F5; 862 break; 863 864 case 0x01F6 : 865 target[pos++] = 0x0195; 866 break; 867 868 case 0x01F7 : 869 target[pos++] = 0x01BF; 870 break; 871 872 case 0x01F8 : 873 target[pos++] = 0x01F9; 874 break; 875 876 case 0x01FA : 877 target[pos++] = 0x01FB; 878 break; 879 880 case 0x01FC : 881 target[pos++] = 0x01FD; 882 break; 883 884 case 0x01FE : 885 target[pos++] = 0x01FF; 886 break; 887 888 case 0x0200 : 889 target[pos++] = 0x0201; 890 break; 891 892 case 0x0202 : 893 target[pos++] = 0x0203; 894 break; 895 896 case 0x0204 : 897 target[pos++] = 0x0205; 898 break; 899 900 case 0x0206 : 901 target[pos++] = 0x0207; 902 break; 903 904 case 0x0208 : 905 target[pos++] = 0x0209; 906 break; 907 908 case 0x020A : 909 target[pos++] = 0x020B; 910 break; 911 912 case 0x020C : 913 target[pos++] = 0x020D; 914 break; 915 916 case 0x020E : 917 target[pos++] = 0x020F; 918 break; 919 920 case 0x0210 : 921 target[pos++] = 0x0211; 922 break; 923 924 case 0x0212 : 925 target[pos++] = 0x0213; 926 break; 927 928 case 0x0214 : 929 target[pos++] = 0x0215; 930 break; 931 932 case 0x0216 : 933 target[pos++] = 0x0217; 934 break; 935 936 case 0x0218 : 937 target[pos++] = 0x0219; 938 break; 939 940 case 0x021A : 941 target[pos++] = 0x021B; 942 break; 943 944 case 0x021C : 945 target[pos++] = 0x021D; 946 break; 947 948 case 0x021E : 949 target[pos++] = 0x021F; 950 break; 951 952 case 0x0220 : 953 target[pos++] = 0x019E; 954 break; 955 956 case 0x0222 : 957 target[pos++] = 0x0223; 958 break; 959 960 case 0x0224 : 961 target[pos++] = 0x0225; 962 break; 963 964 case 0x0226 : 965 target[pos++] = 0x0227; 966 break; 967 968 case 0x0228 : 969 target[pos++] = 0x0229; 970 break; 971 972 case 0x022A : 973 target[pos++] = 0x022B; 974 break; 975 976 case 0x022C : 977 target[pos++] = 0x022D; 978 break; 979 980 case 0x022E : 981 target[pos++] = 0x022F; 982 break; 983 984 case 0x0230 : 985 target[pos++] = 0x0231; 986 break; 987 988 case 0x0232 : 989 target[pos++] = 0x0233; 990 break; 991 992 case 0x0345 : 993 target[pos++] = 0x03B9; 994 break; 995 996 case 0x034F : 997 break; 998 999 case 0x037A : 1000 target[pos++] = 0x0020; 1001 target[pos++] = 0x03B9; 1002 break; 1003 1004 case 0x0386 : 1005 target[pos++] = 0x03AC; 1006 break; 1007 1008 case 0x0388 : 1009 target[pos++] = 0x03AD; 1010 break; 1011 1012 case 0x0389 : 1013 target[pos++] = 0x03AE; 1014 break; 1015 1016 case 0x038A : 1017 target[pos++] = 0x03AF; 1018 break; 1019 1020 case 0x038C : 1021 target[pos++] = 0x03CC; 1022 break; 1023 1024 case 0x038E : 1025 target[pos++] = 0x03CD; 1026 break; 1027 1028 case 0x038F : 1029 target[pos++] = 0x03CE; 1030 break; 1031 1032 case 0x0390 : 1033 target[pos++] = 0x03B9; 1034 target[pos++] = 0x0308; 1035 target[pos++] = 0x0301; 1036 break; 1037 1038 case 0x0391 : 1039 target[pos++] = 0x03B1; 1040 break; 1041 1042 case 0x0392 : 1043 target[pos++] = 0x03B2; 1044 break; 1045 1046 case 0x0393 : 1047 target[pos++] = 0x03B3; 1048 break; 1049 1050 case 0x0394 : 1051 target[pos++] = 0x03B4; 1052 break; 1053 1054 case 0x0395 : 1055 target[pos++] = 0x03B5; 1056 break; 1057 1058 case 0x0396 : 1059 target[pos++] = 0x03B6; 1060 break; 1061 1062 case 0x0397 : 1063 target[pos++] = 0x03B7; 1064 break; 1065 1066 case 0x0398 : 1067 target[pos++] = 0x03B8; 1068 break; 1069 1070 case 0x0399 : 1071 target[pos++] = 0x03B9; 1072 break; 1073 1074 case 0x039A : 1075 target[pos++] = 0x03BA; 1076 break; 1077 1078 case 0x039B : 1079 target[pos++] = 0x03BB; 1080 break; 1081 1082 case 0x039C : 1083 target[pos++] = 0x03BC; 1084 break; 1085 1086 case 0x039D : 1087 target[pos++] = 0x03BD; 1088 break; 1089 1090 case 0x039E : 1091 target[pos++] = 0x03BE; 1092 break; 1093 1094 case 0x039F : 1095 target[pos++] = 0x03BF; 1096 break; 1097 1098 case 0x03A0 : 1099 target[pos++] = 0x03C0; 1100 break; 1101 1102 case 0x03A1 : 1103 target[pos++] = 0x03C1; 1104 break; 1105 1106 case 0x03A3 : 1107 target[pos++] = 0x03C3; 1108 break; 1109 1110 case 0x03A4 : 1111 target[pos++] = 0x03C4; 1112 break; 1113 1114 case 0x03A5 : 1115 target[pos++] = 0x03C5; 1116 break; 1117 1118 case 0x03A6 : 1119 target[pos++] = 0x03C6; 1120 break; 1121 1122 case 0x03A7 : 1123 target[pos++] = 0x03C7; 1124 break; 1125 1126 case 0x03A8 : 1127 target[pos++] = 0x03C8; 1128 break; 1129 1130 case 0x03A9 : 1131 target[pos++] = 0x03C9; 1132 break; 1133 1134 case 0x03AA : 1135 target[pos++] = 0x03CA; 1136 break; 1137 1138 case 0x03AB : 1139 target[pos++] = 0x03CB; 1140 break; 1141 1142 case 0x03B0 : 1143 target[pos++] = 0x03C5; 1144 target[pos++] = 0x0308; 1145 target[pos++] = 0x0301; 1146 break; 1147 1148 case 0x03C2 : 1149 target[pos++] = 0x03C3; 1150 break; 1151 1152 case 0x03D0 : 1153 target[pos++] = 0x03B2; 1154 break; 1155 1156 case 0x03D1 : 1157 target[pos++] = 0x03B8; 1158 break; 1159 1160 case 0x03D2 : 1161 target[pos++] = 0x03C5; 1162 break; 1163 1164 case 0x03D3 : 1165 target[pos++] = 0x03CD; 1166 break; 1167 1168 case 0x03D4 : 1169 target[pos++] = 0x03CB; 1170 break; 1171 1172 case 0x03D5 : 1173 target[pos++] = 0x03C6; 1174 break; 1175 1176 case 0x03D6 : 1177 target[pos++] = 0x03C0; 1178 break; 1179 1180 case 0x03D8 : 1181 target[pos++] = 0x03D9; 1182 break; 1183 1184 case 0x03DA : 1185 target[pos++] = 0x03DB; 1186 break; 1187 1188 case 0x03DC : 1189 target[pos++] = 0x03DD; 1190 break; 1191 1192 case 0x03DE : 1193 target[pos++] = 0x03DF; 1194 break; 1195 1196 case 0x03E0 : 1197 target[pos++] = 0x03E1; 1198 break; 1199 1200 case 0x03E2 : 1201 target[pos++] = 0x03E3; 1202 break; 1203 1204 case 0x03E4 : 1205 target[pos++] = 0x03E5; 1206 break; 1207 1208 case 0x03E6 : 1209 target[pos++] = 0x03E7; 1210 break; 1211 1212 case 0x03E8 : 1213 target[pos++] = 0x03E9; 1214 break; 1215 1216 case 0x03EA : 1217 target[pos++] = 0x03EB; 1218 break; 1219 1220 case 0x03EC : 1221 target[pos++] = 0x03ED; 1222 break; 1223 1224 case 0x03EE : 1225 target[pos++] = 0x03EF; 1226 break; 1227 1228 case 0x03F0 : 1229 target[pos++] = 0x03BA; 1230 break; 1231 1232 case 0x03F1 : 1233 target[pos++] = 0x03C1; 1234 break; 1235 1236 case 0x03F2 : 1237 target[pos++] = 0x03C3; 1238 break; 1239 1240 case 0x03F4 : 1241 target[pos++] = 0x03B8; 1242 break; 1243 1244 case 0x03F5 : 1245 target[pos++] = 0x03B5; 1246 break; 1247 1248 case 0x0400 : 1249 target[pos++] = 0x0450; 1250 break; 1251 1252 case 0x0401 : 1253 target[pos++] = 0x0451; 1254 break; 1255 1256 case 0x0402 : 1257 target[pos++] = 0x0452; 1258 break; 1259 1260 case 0x0403 : 1261 target[pos++] = 0x0453; 1262 break; 1263 1264 case 0x0404 : 1265 target[pos++] = 0x0454; 1266 break; 1267 1268 case 0x0405 : 1269 target[pos++] = 0x0455; 1270 break; 1271 1272 case 0x0406 : 1273 target[pos++] = 0x0456; 1274 break; 1275 1276 case 0x0407 : 1277 target[pos++] = 0x0457; 1278 break; 1279 1280 case 0x0408 : 1281 target[pos++] = 0x0458; 1282 break; 1283 1284 case 0x0409 : 1285 target[pos++] = 0x0459; 1286 break; 1287 1288 case 0x040A : 1289 target[pos++] = 0x045A; 1290 break; 1291 1292 case 0x040B : 1293 target[pos++] = 0x045B; 1294 break; 1295 1296 case 0x040C : 1297 target[pos++] = 0x045C; 1298 break; 1299 1300 case 0x040D : 1301 target[pos++] = 0x045D; 1302 break; 1303 1304 case 0x040E : 1305 target[pos++] = 0x045E; 1306 break; 1307 1308 case 0x040F : 1309 target[pos++] = 0x045F; 1310 break; 1311 1312 case 0x0410 : 1313 target[pos++] = 0x0430; 1314 break; 1315 1316 case 0x0411 : 1317 target[pos++] = 0x0431; 1318 break; 1319 1320 case 0x0412 : 1321 target[pos++] = 0x0432; 1322 break; 1323 1324 case 0x0413 : 1325 target[pos++] = 0x0433; 1326 break; 1327 1328 case 0x0414 : 1329 target[pos++] = 0x0434; 1330 break; 1331 1332 case 0x0415 : 1333 target[pos++] = 0x0435; 1334 break; 1335 1336 case 0x0416 : 1337 target[pos++] = 0x0436; 1338 break; 1339 1340 case 0x0417 : 1341 target[pos++] = 0x0437; 1342 break; 1343 1344 case 0x0418 : 1345 target[pos++] = 0x0438; 1346 break; 1347 1348 case 0x0419 : 1349 target[pos++] = 0x0439; 1350 break; 1351 1352 case 0x041A : 1353 target[pos++] = 0x043A; 1354 break; 1355 1356 case 0x041B : 1357 target[pos++] = 0x043B; 1358 break; 1359 1360 case 0x041C : 1361 target[pos++] = 0x043C; 1362 break; 1363 1364 case 0x041D : 1365 target[pos++] = 0x043D; 1366 break; 1367 1368 case 0x041E : 1369 target[pos++] = 0x043E; 1370 break; 1371 1372 case 0x041F : 1373 target[pos++] = 0x043F; 1374 break; 1375 1376 case 0x0420 : 1377 target[pos++] = 0x0440; 1378 break; 1379 1380 case 0x0421 : 1381 target[pos++] = 0x0441; 1382 break; 1383 1384 case 0x0422 : 1385 target[pos++] = 0x0442; 1386 break; 1387 1388 case 0x0423 : 1389 target[pos++] = 0x0443; 1390 break; 1391 1392 case 0x0424 : 1393 target[pos++] = 0x0444; 1394 break; 1395 1396 case 0x0425 : 1397 target[pos++] = 0x0445; 1398 break; 1399 1400 case 0x0426 : 1401 target[pos++] = 0x0446; 1402 break; 1403 1404 case 0x0427 : 1405 target[pos++] = 0x0447; 1406 break; 1407 1408 case 0x0428 : 1409 target[pos++] = 0x0448; 1410 break; 1411 1412 case 0x0429 : 1413 target[pos++] = 0x0449; 1414 break; 1415 1416 case 0x042A : 1417 target[pos++] = 0x044A; 1418 break; 1419 1420 case 0x042B : 1421 target[pos++] = 0x044B; 1422 break; 1423 1424 case 0x042C : 1425 target[pos++] = 0x044C; 1426 break; 1427 1428 case 0x042D : 1429 target[pos++] = 0x044D; 1430 break; 1431 1432 case 0x042E : 1433 target[pos++] = 0x044E; 1434 break; 1435 1436 case 0x042F : 1437 target[pos++] = 0x044F; 1438 break; 1439 1440 case 0x0460 : 1441 target[pos++] = 0x0461; 1442 break; 1443 1444 case 0x0462 : 1445 target[pos++] = 0x0463; 1446 break; 1447 1448 case 0x0464 : 1449 target[pos++] = 0x0465; 1450 break; 1451 1452 case 0x0466 : 1453 target[pos++] = 0x0467; 1454 break; 1455 1456 case 0x0468 : 1457 target[pos++] = 0x0469; 1458 break; 1459 1460 case 0x046A : 1461 target[pos++] = 0x046B; 1462 break; 1463 1464 case 0x046C : 1465 target[pos++] = 0x046D; 1466 break; 1467 1468 case 0x046E : 1469 target[pos++] = 0x046F; 1470 break; 1471 1472 case 0x0470 : 1473 target[pos++] = 0x0471; 1474 break; 1475 1476 case 0x0472 : 1477 target[pos++] = 0x0473; 1478 break; 1479 1480 case 0x0474 : 1481 target[pos++] = 0x0475; 1482 break; 1483 1484 case 0x0476 : 1485 target[pos++] = 0x0477; 1486 break; 1487 1488 case 0x0478 : 1489 target[pos++] = 0x0479; 1490 break; 1491 1492 case 0x047A : 1493 target[pos++] = 0x047B; 1494 break; 1495 1496 case 0x047C : 1497 target[pos++] = 0x047D; 1498 break; 1499 1500 case 0x047E : 1501 target[pos++] = 0x047F; 1502 break; 1503 1504 case 0x0480 : 1505 target[pos++] = 0x0481; 1506 break; 1507 1508 case 0x048A : 1509 target[pos++] = 0x048B; 1510 break; 1511 1512 case 0x048C : 1513 target[pos++] = 0x048D; 1514 break; 1515 1516 case 0x048E : 1517 target[pos++] = 0x048F; 1518 break; 1519 1520 case 0x0490 : 1521 target[pos++] = 0x0491; 1522 break; 1523 1524 case 0x0492 : 1525 target[pos++] = 0x0493; 1526 break; 1527 1528 case 0x0494 : 1529 target[pos++] = 0x0495; 1530 break; 1531 1532 case 0x0496 : 1533 target[pos++] = 0x0497; 1534 break; 1535 1536 case 0x0498 : 1537 target[pos++] = 0x0499; 1538 break; 1539 1540 case 0x049A : 1541 target[pos++] = 0x049B; 1542 break; 1543 1544 case 0x049C : 1545 target[pos++] = 0x049D; 1546 break; 1547 1548 case 0x049E : 1549 target[pos++] = 0x049F; 1550 break; 1551 1552 case 0x04A0 : 1553 target[pos++] = 0x04A1; 1554 break; 1555 1556 case 0x04A2 : 1557 target[pos++] = 0x04A3; 1558 break; 1559 1560 case 0x04A4 : 1561 target[pos++] = 0x04A5; 1562 break; 1563 1564 case 0x04A6 : 1565 target[pos++] = 0x04A7; 1566 break; 1567 1568 case 0x04A8 : 1569 target[pos++] = 0x04A9; 1570 break; 1571 1572 case 0x04AA : 1573 target[pos++] = 0x04AB; 1574 break; 1575 1576 case 0x04AC : 1577 target[pos++] = 0x04AD; 1578 break; 1579 1580 case 0x04AE : 1581 target[pos++] = 0x04AF; 1582 break; 1583 1584 case 0x04B0 : 1585 target[pos++] = 0x04B1; 1586 break; 1587 1588 case 0x04B2 : 1589 target[pos++] = 0x04B3; 1590 break; 1591 1592 case 0x04B4 : 1593 target[pos++] = 0x04B5; 1594 break; 1595 1596 case 0x04B6 : 1597 target[pos++] = 0x04B7; 1598 break; 1599 1600 case 0x04B8 : 1601 target[pos++] = 0x04B9; 1602 break; 1603 1604 case 0x04BA : 1605 target[pos++] = 0x04BB; 1606 break; 1607 1608 case 0x04BC : 1609 target[pos++] = 0x04BD; 1610 break; 1611 1612 case 0x04BE : 1613 target[pos++] = 0x04BF; 1614 break; 1615 1616 case 0x04C1 : 1617 target[pos++] = 0x04C2; 1618 break; 1619 1620 case 0x04C3 : 1621 target[pos++] = 0x04C4; 1622 break; 1623 1624 case 0x04C5 : 1625 target[pos++] = 0x04C6; 1626 break; 1627 1628 case 0x04C7 : 1629 target[pos++] = 0x04C8; 1630 break; 1631 1632 case 0x04C9 : 1633 target[pos++] = 0x04CA; 1634 break; 1635 1636 case 0x04CB : 1637 target[pos++] = 0x04CC; 1638 break; 1639 1640 case 0x04CD : 1641 target[pos++] = 0x04CE; 1642 break; 1643 1644 case 0x04D0 : 1645 target[pos++] = 0x04D1; 1646 break; 1647 1648 case 0x04D2 : 1649 target[pos++] = 0x04D3; 1650 break; 1651 1652 case 0x04D4 : 1653 target[pos++] = 0x04D5; 1654 break; 1655 1656 case 0x04D6 : 1657 target[pos++] = 0x04D7; 1658 break; 1659 1660 case 0x04D8 : 1661 target[pos++] = 0x04D9; 1662 break; 1663 1664 case 0x04DA : 1665 target[pos++] = 0x04DB; 1666 break; 1667 1668 case 0x04DC : 1669 target[pos++] = 0x04DD; 1670 break; 1671 1672 case 0x04DE : 1673 target[pos++] = 0x04DF; 1674 break; 1675 1676 case 0x04E0 : 1677 target[pos++] = 0x04E1; 1678 break; 1679 1680 case 0x04E2 : 1681 target[pos++] = 0x04E3; 1682 break; 1683 1684 case 0x04E4 : 1685 target[pos++] = 0x04E5; 1686 break; 1687 1688 case 0x04E6 : 1689 target[pos++] = 0x04E7; 1690 break; 1691 1692 case 0x04E8 : 1693 target[pos++] = 0x04E9; 1694 break; 1695 1696 case 0x04EA : 1697 target[pos++] = 0x04EB; 1698 break; 1699 1700 case 0x04EC : 1701 target[pos++] = 0x04ED; 1702 break; 1703 1704 case 0x04EE : 1705 target[pos++] = 0x04EF; 1706 break; 1707 1708 case 0x04F0 : 1709 target[pos++] = 0x04F1; 1710 break; 1711 1712 case 0x04F2 : 1713 target[pos++] = 0x04F3; 1714 break; 1715 1716 case 0x04F4 : 1717 target[pos++] = 0x04F5; 1718 break; 1719 1720 case 0x04F8 : 1721 target[pos++] = 0x04F9; 1722 break; 1723 1724 case 0x0500 : 1725 target[pos++] = 0x0501; 1726 break; 1727 1728 case 0x0502 : 1729 target[pos++] = 0x0503; 1730 break; 1731 1732 case 0x0504 : 1733 target[pos++] = 0x0505; 1734 break; 1735 1736 case 0x0506 : 1737 target[pos++] = 0x0507; 1738 break; 1739 1740 case 0x0508 : 1741 target[pos++] = 0x0509; 1742 break; 1743 1744 case 0x050A : 1745 target[pos++] = 0x050B; 1746 break; 1747 1748 case 0x050C : 1749 target[pos++] = 0x050D; 1750 break; 1751 1752 case 0x050E : 1753 target[pos++] = 0x050F; 1754 break; 1755 1756 case 0x0531 : 1757 target[pos++] = 0x0561; 1758 break; 1759 1760 case 0x0532 : 1761 target[pos++] = 0x0562; 1762 break; 1763 1764 case 0x0533 : 1765 target[pos++] = 0x0563; 1766 break; 1767 1768 case 0x0534 : 1769 target[pos++] = 0x0564; 1770 break; 1771 1772 case 0x0535 : 1773 target[pos++] = 0x0565; 1774 break; 1775 1776 case 0x0536 : 1777 target[pos++] = 0x0566; 1778 break; 1779 1780 case 0x0537 : 1781 target[pos++] = 0x0567; 1782 break; 1783 1784 case 0x0538 : 1785 target[pos++] = 0x0568; 1786 break; 1787 1788 case 0x0539 : 1789 target[pos++] = 0x0569; 1790 break; 1791 1792 case 0x053A : 1793 target[pos++] = 0x056A; 1794 break; 1795 1796 case 0x053B : 1797 target[pos++] = 0x056B; 1798 break; 1799 1800 case 0x053C : 1801 target[pos++] = 0x056C; 1802 break; 1803 1804 case 0x053D : 1805 target[pos++] = 0x056D; 1806 break; 1807 1808 case 0x053E : 1809 target[pos++] = 0x056E; 1810 break; 1811 1812 case 0x053F : 1813 target[pos++] = 0x056F; 1814 break; 1815 1816 case 0x0540 : 1817 target[pos++] = 0x0570; 1818 break; 1819 1820 case 0x0541 : 1821 target[pos++] = 0x0571; 1822 break; 1823 1824 case 0x0542 : 1825 target[pos++] = 0x0572; 1826 break; 1827 1828 case 0x0543 : 1829 target[pos++] = 0x0573; 1830 break; 1831 1832 case 0x0544 : 1833 target[pos++] = 0x0574; 1834 break; 1835 1836 case 0x0545 : 1837 target[pos++] = 0x0575; 1838 break; 1839 1840 case 0x0546 : 1841 target[pos++] = 0x0576; 1842 break; 1843 1844 case 0x0547 : 1845 target[pos++] = 0x0577; 1846 break; 1847 1848 case 0x0548 : 1849 target[pos++] = 0x0578; 1850 break; 1851 1852 case 0x0549 : 1853 target[pos++] = 0x0579; 1854 break; 1855 1856 case 0x054A : 1857 target[pos++] = 0x057A; 1858 break; 1859 1860 case 0x054B : 1861 target[pos++] = 0x057B; 1862 break; 1863 1864 case 0x054C : 1865 target[pos++] = 0x057C; 1866 break; 1867 1868 case 0x054D : 1869 target[pos++] = 0x057D; 1870 break; 1871 1872 case 0x054E : 1873 target[pos++] = 0x057E; 1874 break; 1875 1876 case 0x054F : 1877 target[pos++] = 0x057F; 1878 break; 1879 1880 case 0x0550 : 1881 target[pos++] = 0x0580; 1882 break; 1883 1884 case 0x0551 : 1885 target[pos++] = 0x0581; 1886 break; 1887 1888 case 0x0552 : 1889 target[pos++] = 0x0582; 1890 break; 1891 1892 case 0x0553 : 1893 target[pos++] = 0x0583; 1894 break; 1895 1896 case 0x0554 : 1897 target[pos++] = 0x0584; 1898 break; 1899 1900 case 0x0555 : 1901 target[pos++] = 0x0585; 1902 break; 1903 1904 case 0x0556 : 1905 target[pos++] = 0x0586; 1906 break; 1907 1908 case 0x0587 : 1909 target[pos++] = 0x0565; 1910 target[pos++] = 0x0582; 1911 break; 1912 1913 case 0x06DD : 1914 break; 1915 1916 case 0x070F : 1917 break; 1918 1919 case 0x1680 : 1920 target[pos++] = 0x0020; 1921 break; 1922 1923 case 0x1806 : 1924 break; 1925 1926 case 0x180B : 1927 case 0x180C : 1928 case 0x180D : 1929 case 0x180E : 1930 break; 1931 1932 1933 case 0x1E00 : 1934 target[pos++] = 0x1E01; 1935 break; 1936 1937 case 0x1E02 : 1938 target[pos++] = 0x1E03; 1939 break; 1940 1941 case 0x1E04 : 1942 target[pos++] = 0x1E05; 1943 break; 1944 1945 case 0x1E06 : 1946 target[pos++] = 0x1E07; 1947 break; 1948 1949 case 0x1E08 : 1950 target[pos++] = 0x1E09; 1951 break; 1952 1953 case 0x1E0A : 1954 target[pos++] = 0x1E0B; 1955 break; 1956 1957 case 0x1E0C : 1958 target[pos++] = 0x1E0D; 1959 break; 1960 1961 case 0x1E0E : 1962 target[pos++] = 0x1E0F; 1963 break; 1964 1965 case 0x1E10 : 1966 target[pos++] = 0x1E11; 1967 break; 1968 1969 case 0x1E12 : 1970 target[pos++] = 0x1E13; 1971 break; 1972 1973 case 0x1E14 : 1974 target[pos++] = 0x1E15; 1975 break; 1976 1977 case 0x1E16 : 1978 target[pos++] = 0x1E17; 1979 break; 1980 1981 case 0x1E18 : 1982 target[pos++] = 0x1E19; 1983 break; 1984 1985 case 0x1E1A : 1986 target[pos++] = 0x1E1B; 1987 break; 1988 1989 case 0x1E1C : 1990 target[pos++] = 0x1E1D; 1991 break; 1992 1993 case 0x1E1E : 1994 target[pos++] = 0x1E1F; 1995 break; 1996 1997 case 0x1E20 : 1998 target[pos++] = 0x1E21; 1999 break; 2000 2001 case 0x1E22 : 2002 target[pos++] = 0x1E23; 2003 break; 2004 2005 case 0x1E24 : 2006 target[pos++] = 0x1E25; 2007 break; 2008 2009 case 0x1E26 : 2010 target[pos++] = 0x1E27; 2011 break; 2012 2013 case 0x1E28 : 2014 target[pos++] = 0x1E29; 2015 break; 2016 2017 case 0x1E2A : 2018 target[pos++] = 0x1E2B; 2019 break; 2020 2021 case 0x1E2C : 2022 target[pos++] = 0x1E2D; 2023 break; 2024 2025 case 0x1E2E : 2026 target[pos++] = 0x1E2F; 2027 break; 2028 2029 case 0x1E30 : 2030 target[pos++] = 0x1E31; 2031 break; 2032 2033 case 0x1E32 : 2034 target[pos++] = 0x1E33; 2035 break; 2036 2037 case 0x1E34 : 2038 target[pos++] = 0x1E35; 2039 break; 2040 2041 case 0x1E36 : 2042 target[pos++] = 0x1E37; 2043 break; 2044 2045 case 0x1E38 : 2046 target[pos++] = 0x1E39; 2047 break; 2048 2049 case 0x1E3A : 2050 target[pos++] = 0x1E3B; 2051 break; 2052 2053 case 0x1E3C : 2054 target[pos++] = 0x1E3D; 2055 break; 2056 2057 case 0x1E3E : 2058 target[pos++] = 0x1E3F; 2059 break; 2060 2061 case 0x1E40 : 2062 target[pos++] = 0x1E41; 2063 break; 2064 2065 case 0x1E42 : 2066 target[pos++] = 0x1E43; 2067 break; 2068 2069 case 0x1E44 : 2070 target[pos++] = 0x1E45; 2071 break; 2072 2073 case 0x1E46 : 2074 target[pos++] = 0x1E47; 2075 break; 2076 2077 case 0x1E48 : 2078 target[pos++] = 0x1E49; 2079 break; 2080 2081 case 0x1E4A : 2082 target[pos++] = 0x1E4B; 2083 break; 2084 2085 case 0x1E4C : 2086 target[pos++] = 0x1E4D; 2087 break; 2088 2089 case 0x1E4E : 2090 target[pos++] = 0x1E4F; 2091 break; 2092 2093 case 0x1E50 : 2094 target[pos++] = 0x1E51; 2095 break; 2096 2097 case 0x1E52 : 2098 target[pos++] = 0x1E53; 2099 break; 2100 2101 case 0x1E54 : 2102 target[pos++] = 0x1E55; 2103 break; 2104 2105 case 0x1E56 : 2106 target[pos++] = 0x1E57; 2107 break; 2108 2109 case 0x1E58 : 2110 target[pos++] = 0x1E59; 2111 break; 2112 2113 case 0x1E5A : 2114 target[pos++] = 0x1E5B; 2115 break; 2116 2117 case 0x1E5C : 2118 target[pos++] = 0x1E5D; 2119 break; 2120 2121 case 0x1E5E : 2122 target[pos++] = 0x1E5F; 2123 break; 2124 2125 case 0x1E60 : 2126 target[pos++] = 0x1E61; 2127 break; 2128 2129 case 0x1E62 : 2130 target[pos++] = 0x1E63; 2131 break; 2132 2133 case 0x1E64 : 2134 target[pos++] = 0x1E65; 2135 break; 2136 2137 case 0x1E66 : 2138 target[pos++] = 0x1E67; 2139 break; 2140 2141 case 0x1E68 : 2142 target[pos++] = 0x1E69; 2143 break; 2144 2145 case 0x1E6A : 2146 target[pos++] = 0x1E6B; 2147 break; 2148 2149 case 0x1E6C : 2150 target[pos++] = 0x1E6D; 2151 break; 2152 2153 case 0x1E6E : 2154 target[pos++] = 0x1E6F; 2155 break; 2156 2157 case 0x1E70 : 2158 target[pos++] = 0x1E71; 2159 break; 2160 2161 case 0x1E72 : 2162 target[pos++] = 0x1E73; 2163 break; 2164 2165 case 0x1E74 : 2166 target[pos++] = 0x1E75; 2167 break; 2168 2169 case 0x1E76 : 2170 target[pos++] = 0x1E77; 2171 break; 2172 2173 case 0x1E78 : 2174 target[pos++] = 0x1E79; 2175 break; 2176 2177 case 0x1E7A : 2178 target[pos++] = 0x1E7B; 2179 break; 2180 2181 case 0x1E7C : 2182 target[pos++] = 0x1E7D; 2183 break; 2184 2185 case 0x1E7E : 2186 target[pos++] = 0x1E7F; 2187 break; 2188 2189 case 0x1E80 : 2190 target[pos++] = 0x1E81; 2191 break; 2192 2193 case 0x1E82 : 2194 target[pos++] = 0x1E83; 2195 break; 2196 2197 case 0x1E84 : 2198 target[pos++] = 0x1E85; 2199 break; 2200 2201 case 0x1E86 : 2202 target[pos++] = 0x1E87; 2203 break; 2204 2205 case 0x1E88 : 2206 target[pos++] = 0x1E89; 2207 break; 2208 2209 case 0x1E8A : 2210 target[pos++] = 0x1E8B; 2211 break; 2212 2213 case 0x1E8C : 2214 target[pos++] = 0x1E8D; 2215 break; 2216 2217 case 0x1E8E : 2218 target[pos++] = 0x1E8F; 2219 break; 2220 2221 case 0x1E90 : 2222 target[pos++] = 0x1E91; 2223 break; 2224 2225 case 0x1E92 : 2226 target[pos++] = 0x1E93; 2227 break; 2228 2229 case 0x1E94 : 2230 target[pos++] = 0x1E95; 2231 break; 2232 2233 case 0x1E96 : 2234 target[pos++] = 0x0068; 2235 target[pos++] = 0x0331; 2236 break; 2237 2238 case 0x1E97 : 2239 target[pos++] = 0x0074; 2240 target[pos++] = 0x0308; 2241 break; 2242 2243 case 0x1E98 : 2244 target[pos++] = 0x0077; 2245 target[pos++] = 0x030A; 2246 break; 2247 2248 case 0x1E99 : 2249 target[pos++] = 0x0079; 2250 target[pos++] = 0x030A; 2251 break; 2252 2253 case 0x1E9A : 2254 target[pos++] = 0x0061; 2255 target[pos++] = 0x02BE; 2256 break; 2257 2258 case 0x1E9B : 2259 target[pos++] = 0x1E61; 2260 break; 2261 2262 case 0x1EA0 : 2263 target[pos++] = 0x1EA1; 2264 break; 2265 2266 case 0x1EA2 : 2267 target[pos++] = 0x1EA3; 2268 break; 2269 2270 case 0x1EA4 : 2271 target[pos++] = 0x1EA5; 2272 break; 2273 2274 case 0x1EA6 : 2275 target[pos++] = 0x1EA7; 2276 break; 2277 2278 case 0x1EA8 : 2279 target[pos++] = 0x1EA9; 2280 break; 2281 2282 case 0x1EAA : 2283 target[pos++] = 0x1EAB; 2284 break; 2285 2286 case 0x1EAC : 2287 target[pos++] = 0x1EAD; 2288 break; 2289 2290 case 0x1EAE : 2291 target[pos++] = 0x1EAF; 2292 break; 2293 2294 case 0x1EB0 : 2295 target[pos++] = 0x1EB1; 2296 break; 2297 2298 case 0x1EB2 : 2299 target[pos++] = 0x1EB3; 2300 break; 2301 2302 case 0x1EB4 : 2303 target[pos++] = 0x1EB5; 2304 break; 2305 2306 case 0x1EB6 : 2307 target[pos++] = 0x1EB7; 2308 break; 2309 2310 case 0x1EB8 : 2311 target[pos++] = 0x1EB9; 2312 break; 2313 2314 case 0x1EBA : 2315 target[pos++] = 0x1EBB; 2316 break; 2317 2318 case 0x1EBC : 2319 target[pos++] = 0x1EBD; 2320 break; 2321 2322 case 0x1EBE : 2323 target[pos++] = 0x1EBF; 2324 break; 2325 2326 case 0x1EC0 : 2327 target[pos++] = 0x1EC1; 2328 break; 2329 2330 case 0x1EC2 : 2331 target[pos++] = 0x1EC3; 2332 break; 2333 2334 case 0x1EC4 : 2335 target[pos++] = 0x1EC5; 2336 break; 2337 2338 case 0x1EC6 : 2339 target[pos++] = 0x1EC7; 2340 break; 2341 2342 case 0x1EC8 : 2343 target[pos++] = 0x1EC9; 2344 break; 2345 2346 case 0x1ECA : 2347 target[pos++] = 0x1ECB; 2348 break; 2349 2350 case 0x1ECC : 2351 target[pos++] = 0x1ECD; 2352 break; 2353 2354 case 0x1ECE : 2355 target[pos++] = 0x1ECF; 2356 break; 2357 2358 case 0x1ED0 : 2359 target[pos++] = 0x1ED1; 2360 break; 2361 2362 case 0x1ED2 : 2363 target[pos++] = 0x1ED3; 2364 break; 2365 2366 case 0x1ED4 : 2367 target[pos++] = 0x1ED5; 2368 break; 2369 2370 case 0x1ED6 : 2371 target[pos++] = 0x1ED7; 2372 break; 2373 2374 case 0x1ED8 : 2375 target[pos++] = 0x1ED9; 2376 break; 2377 2378 case 0x1EDA : 2379 target[pos++] = 0x1EDB; 2380 break; 2381 2382 case 0x1EDC : 2383 target[pos++] = 0x1EDD; 2384 break; 2385 2386 case 0x1EDE : 2387 target[pos++] = 0x1EDF; 2388 break; 2389 2390 case 0x1EE0 : 2391 target[pos++] = 0x1EE1; 2392 break; 2393 2394 case 0x1EE2 : 2395 target[pos++] = 0x1EE3; 2396 break; 2397 2398 case 0x1EE4 : 2399 target[pos++] = 0x1EE5; 2400 break; 2401 2402 case 0x1EE6 : 2403 target[pos++] = 0x1EE7; 2404 break; 2405 2406 case 0x1EE8 : 2407 target[pos++] = 0x1EE9; 2408 break; 2409 2410 case 0x1EEA : 2411 target[pos++] = 0x1EEB; 2412 break; 2413 2414 case 0x1EEC : 2415 target[pos++] = 0x1EED; 2416 break; 2417 2418 case 0x1EEE : 2419 target[pos++] = 0x1EEF; 2420 break; 2421 2422 case 0x1EF0 : 2423 target[pos++] = 0x1EF1; 2424 break; 2425 2426 case 0x1EF2 : 2427 target[pos++] = 0x1EF3; 2428 break; 2429 2430 case 0x1EF4 : 2431 target[pos++] = 0x1EF5; 2432 break; 2433 2434 case 0x1EF6 : 2435 target[pos++] = 0x1EF7; 2436 break; 2437 2438 case 0x1EF8 : 2439 target[pos++] = 0x1EF9; 2440 break; 2441 2442 case 0x1F08 : 2443 target[pos++] = 0x1F00; 2444 break; 2445 2446 case 0x1F09 : 2447 target[pos++] = 0x1F01; 2448 break; 2449 2450 case 0x1F0A : 2451 target[pos++] = 0x1F02; 2452 break; 2453 2454 case 0x1F0B : 2455 target[pos++] = 0x1F03; 2456 break; 2457 2458 case 0x1F0C : 2459 target[pos++] = 0x1F04; 2460 break; 2461 2462 case 0x1F0D : 2463 target[pos++] = 0x1F05; 2464 break; 2465 2466 case 0x1F0E : 2467 target[pos++] = 0x1F06; 2468 break; 2469 2470 case 0x1F0F : 2471 target[pos++] = 0x1F07; 2472 break; 2473 2474 case 0x1F18 : 2475 target[pos++] = 0x1F10; 2476 break; 2477 2478 case 0x1F19 : 2479 target[pos++] = 0x1F11; 2480 break; 2481 2482 case 0x1F1A : 2483 target[pos++] = 0x1F12; 2484 break; 2485 2486 case 0x1F1B : 2487 target[pos++] = 0x1F13; 2488 break; 2489 2490 case 0x1F1C : 2491 target[pos++] = 0x1F14; 2492 break; 2493 2494 case 0x1F1D : 2495 target[pos++] = 0x1F15; 2496 break; 2497 2498 case 0x1F28 : 2499 target[pos++] = 0x1F20; 2500 break; 2501 2502 case 0x1F29 : 2503 target[pos++] = 0x1F21; 2504 break; 2505 2506 case 0x1F2A : 2507 target[pos++] = 0x1F22; 2508 break; 2509 2510 case 0x1F2B : 2511 target[pos++] = 0x1F23; 2512 break; 2513 2514 case 0x1F2C : 2515 target[pos++] = 0x1F24; 2516 break; 2517 2518 case 0x1F2D : 2519 target[pos++] = 0x1F25; 2520 break; 2521 2522 case 0x1F2E : 2523 target[pos++] = 0x1F26; 2524 break; 2525 2526 case 0x1F2F : 2527 target[pos++] = 0x1F27; 2528 break; 2529 2530 case 0x1F38 : 2531 target[pos++] = 0x1F30; 2532 break; 2533 2534 case 0x1F39 : 2535 target[pos++] = 0x1F31; 2536 break; 2537 2538 case 0x1F3A : 2539 target[pos++] = 0x1F32; 2540 break; 2541 2542 case 0x1F3B : 2543 target[pos++] = 0x1F33; 2544 break; 2545 2546 case 0x1F3C : 2547 target[pos++] = 0x1F34; 2548 break; 2549 2550 case 0x1F3D : 2551 target[pos++] = 0x1F35; 2552 break; 2553 2554 case 0x1F3E : 2555 target[pos++] = 0x1F36; 2556 break; 2557 2558 case 0x1F3F : 2559 target[pos++] = 0x1F37; 2560 break; 2561 2562 case 0x1F48 : 2563 target[pos++] = 0x1F40; 2564 break; 2565 2566 case 0x1F49 : 2567 target[pos++] = 0x1F41; 2568 break; 2569 2570 case 0x1F4A : 2571 target[pos++] = 0x1F42; 2572 break; 2573 2574 case 0x1F4B : 2575 target[pos++] = 0x1F43; 2576 break; 2577 2578 case 0x1F4C : 2579 target[pos++] = 0x1F44; 2580 break; 2581 2582 case 0x1F4D : 2583 target[pos++] = 0x1F45; 2584 break; 2585 2586 case 0x1F50 : 2587 target[pos++] = 0x03C5; 2588 target[pos++] = 0x0313; 2589 break; 2590 2591 case 0x1F52 : 2592 target[pos++] = 0x03C5; 2593 target[pos++] = 0x0313; 2594 target[pos++] = 0x0300; 2595 break; 2596 2597 case 0x1F54 : 2598 target[pos++] = 0x03C5; 2599 target[pos++] = 0x0313; 2600 target[pos++] = 0x0301; 2601 break; 2602 2603 case 0x1F56 : 2604 target[pos++] = 0x03C5; 2605 target[pos++] = 0x0313; 2606 target[pos++] = 0x0342; 2607 break; 2608 2609 case 0x1F59 : 2610 target[pos++] = 0x1F51; 2611 break; 2612 2613 case 0x1F5B : 2614 target[pos++] = 0x1F53; 2615 break; 2616 2617 case 0x1F5D : 2618 target[pos++] = 0x1F55; 2619 break; 2620 2621 case 0x1F5F : 2622 target[pos++] = 0x1F57; 2623 break; 2624 2625 case 0x1F68 : 2626 target[pos++] = 0x1F60; 2627 break; 2628 2629 case 0x1F69 : 2630 target[pos++] = 0x1F61; 2631 break; 2632 2633 case 0x1F6A : 2634 target[pos++] = 0x1F62; 2635 break; 2636 2637 case 0x1F6B : 2638 target[pos++] = 0x1F63; 2639 break; 2640 2641 case 0x1F6C : 2642 target[pos++] = 0x1F64; 2643 break; 2644 2645 case 0x1F6D : 2646 target[pos++] = 0x1F65; 2647 break; 2648 2649 case 0x1F6E : 2650 target[pos++] = 0x1F66; 2651 break; 2652 2653 case 0x1F6F : 2654 target[pos++] = 0x1F67; 2655 break; 2656 2657 case 0x1F80 : 2658 target[pos++] = 0x1F00; 2659 target[pos++] = 0x03B9; 2660 break; 2661 2662 case 0x1F81 : 2663 target[pos++] = 0x1F01; 2664 target[pos++] = 0x03B9; 2665 break; 2666 2667 case 0x1F82 : 2668 target[pos++] = 0x1F02; 2669 target[pos++] = 0x03B9; 2670 break; 2671 2672 case 0x1F83 : 2673 target[pos++] = 0x1F03; 2674 target[pos++] = 0x03B9; 2675 break; 2676 2677 case 0x1F84 : 2678 target[pos++] = 0x1F04; 2679 target[pos++] = 0x03B9; 2680 break; 2681 2682 case 0x1F85 : 2683 target[pos++] = 0x1F05; 2684 target[pos++] = 0x03B9; 2685 break; 2686 2687 case 0x1F86 : 2688 target[pos++] = 0x1F06; 2689 target[pos++] = 0x03B9; 2690 break; 2691 2692 case 0x1F87 : 2693 target[pos++] = 0x1F07; 2694 target[pos++] = 0x03B9; 2695 break; 2696 2697 case 0x1F88 : 2698 target[pos++] = 0x1F00; 2699 target[pos++] = 0x03B9; 2700 break; 2701 2702 case 0x1F89 : 2703 target[pos++] = 0x1F01; 2704 target[pos++] = 0x03B9; 2705 break; 2706 2707 case 0x1F8A : 2708 target[pos++] = 0x1F02; 2709 target[pos++] = 0x03B9; 2710 break; 2711 2712 case 0x1F8B : 2713 target[pos++] = 0x1F03; 2714 target[pos++] = 0x03B9; 2715 break; 2716 2717 case 0x1F8C : 2718 target[pos++] = 0x1F04; 2719 target[pos++] = 0x03B9; 2720 break; 2721 2722 case 0x1F8D : 2723 target[pos++] = 0x1F05; 2724 target[pos++] = 0x03B9; 2725 break; 2726 2727 case 0x1F8E : 2728 target[pos++] = 0x1F06; 2729 target[pos++] = 0x03B9; 2730 break; 2731 2732 case 0x1F8F : 2733 target[pos++] = 0x1F07; 2734 target[pos++] = 0x03B9; 2735 break; 2736 2737 case 0x1F90 : 2738 target[pos++] = 0x1F20; 2739 target[pos++] = 0x03B9; 2740 break; 2741 2742 case 0x1F91 : 2743 target[pos++] = 0x1F21; 2744 target[pos++] = 0x03B9; 2745 break; 2746 2747 case 0x1F92 : 2748 target[pos++] = 0x1F22; 2749 target[pos++] = 0x03B9; 2750 break; 2751 2752 case 0x1F93 : 2753 target[pos++] = 0x1F23; 2754 target[pos++] = 0x03B9; 2755 break; 2756 2757 case 0x1F94 : 2758 target[pos++] = 0x1F24; 2759 target[pos++] = 0x03B9; 2760 break; 2761 2762 case 0x1F95 : 2763 target[pos++] = 0x1F25; 2764 target[pos++] = 0x03B9; 2765 break; 2766 2767 case 0x1F96 : 2768 target[pos++] = 0x1F26; 2769 target[pos++] = 0x03B9; 2770 break; 2771 2772 case 0x1F97 : 2773 target[pos++] = 0x1F27; 2774 target[pos++] = 0x03B9; 2775 break; 2776 2777 case 0x1F98 : 2778 target[pos++] = 0x1F20; 2779 target[pos++] = 0x03B9; 2780 break; 2781 2782 case 0x1F99 : 2783 target[pos++] = 0x1F21; 2784 target[pos++] = 0x03B9; 2785 break; 2786 2787 case 0x1F9A : 2788 target[pos++] = 0x1F22; 2789 target[pos++] = 0x03B9; 2790 break; 2791 2792 case 0x1F9B : 2793 target[pos++] = 0x1F23; 2794 target[pos++] = 0x03B9; 2795 break; 2796 2797 case 0x1F9C : 2798 target[pos++] = 0x1F24; 2799 target[pos++] = 0x03B9; 2800 break; 2801 2802 case 0x1F9D : 2803 target[pos++] = 0x1F25; 2804 target[pos++] = 0x03B9; 2805 break; 2806 2807 case 0x1F9E : 2808 target[pos++] = 0x1F26; 2809 target[pos++] = 0x03B9; 2810 break; 2811 2812 case 0x1F9F : 2813 target[pos++] = 0x1F27; 2814 target[pos++] = 0x03B9; 2815 break; 2816 2817 case 0x1FA0 : 2818 target[pos++] = 0x1F60; 2819 target[pos++] = 0x03B9; 2820 break; 2821 2822 case 0x1FA1 : 2823 target[pos++] = 0x1F61; 2824 target[pos++] = 0x03B9; 2825 break; 2826 2827 case 0x1FA2 : 2828 target[pos++] = 0x1F62; 2829 target[pos++] = 0x03B9; 2830 break; 2831 2832 case 0x1FA3 : 2833 target[pos++] = 0x1F63; 2834 target[pos++] = 0x03B9; 2835 break; 2836 2837 case 0x1FA4 : 2838 target[pos++] = 0x1F64; 2839 target[pos++] = 0x03B9; 2840 break; 2841 2842 case 0x1FA5 : 2843 target[pos++] = 0x1F65; 2844 target[pos++] = 0x03B9; 2845 break; 2846 2847 case 0x1FA6 : 2848 target[pos++] = 0x1F66; 2849 target[pos++] = 0x03B9; 2850 break; 2851 2852 case 0x1FA7 : 2853 target[pos++] = 0x1F67; 2854 target[pos++] = 0x03B9; 2855 break; 2856 2857 case 0x1FA8 : 2858 target[pos++] = 0x1F60; 2859 target[pos++] = 0x03B9; 2860 break; 2861 2862 case 0x1FA9 : 2863 target[pos++] = 0x1F61; 2864 target[pos++] = 0x03B9; 2865 break; 2866 2867 case 0x1FAA : 2868 target[pos++] = 0x1F62; 2869 target[pos++] = 0x03B9; 2870 break; 2871 2872 case 0x1FAB : 2873 target[pos++] = 0x1F63; 2874 target[pos++] = 0x03B9; 2875 break; 2876 2877 case 0x1FAC : 2878 target[pos++] = 0x1F64; 2879 target[pos++] = 0x03B9; 2880 break; 2881 2882 case 0x1FAD : 2883 target[pos++] = 0x1F65; 2884 target[pos++] = 0x03B9; 2885 break; 2886 2887 case 0x1FAE : 2888 target[pos++] = 0x1F66; 2889 target[pos++] = 0x03B9; 2890 break; 2891 2892 case 0x1FAF : 2893 target[pos++] = 0x1F67; 2894 target[pos++] = 0x03B9; 2895 break; 2896 2897 case 0x1FB2 : 2898 target[pos++] = 0x1F70; 2899 target[pos++] = 0x03B9; 2900 break; 2901 2902 case 0x1FB3 : 2903 target[pos++] = 0x03B1; 2904 target[pos++] = 0x03B9; 2905 break; 2906 2907 case 0x1FB4 : 2908 target[pos++] = 0x03AC; 2909 target[pos++] = 0x03B9; 2910 break; 2911 2912 case 0x1FB6 : 2913 target[pos++] = 0x03B1; 2914 target[pos++] = 0x0342; 2915 break; 2916 2917 case 0x1FB7 : 2918 target[pos++] = 0x03B1; 2919 target[pos++] = 0x0342; 2920 target[pos++] = 0x03B9; 2921 break; 2922 2923 case 0x1FB8 : 2924 target[pos++] = 0x1FB0; 2925 break; 2926 2927 case 0x1FB9 : 2928 target[pos++] = 0x1FB1; 2929 break; 2930 2931 case 0x1FBA : 2932 target[pos++] = 0x1F70; 2933 break; 2934 2935 case 0x1FBB : 2936 target[pos++] = 0x1F71; 2937 break; 2938 2939 case 0x1FBC : 2940 target[pos++] = 0x03B1; 2941 target[pos++] = 0x03B9; 2942 break; 2943 2944 case 0x1FBE : 2945 target[pos++] = 0x03B9; 2946 break; 2947 2948 case 0x1FC2 : 2949 target[pos++] = 0x1F74; 2950 target[pos++] = 0x03B9; 2951 break; 2952 2953 case 0x1FC3 : 2954 target[pos++] = 0x03B7; 2955 target[pos++] = 0x03B9; 2956 break; 2957 2958 case 0x1FC4 : 2959 target[pos++] = 0x03AE; 2960 target[pos++] = 0x03B9; 2961 break; 2962 2963 case 0x1FC6 : 2964 target[pos++] = 0x03B7; 2965 target[pos++] = 0x0342; 2966 break; 2967 2968 case 0x1FC7 : 2969 target[pos++] = 0x03B7; 2970 target[pos++] = 0x0342; 2971 target[pos++] = 0x03B9; 2972 break; 2973 2974 case 0x1FC8 : 2975 target[pos++] = 0x1F72; 2976 break; 2977 2978 case 0x1FC9 : 2979 target[pos++] = 0x1F73; 2980 break; 2981 2982 case 0x1FCA : 2983 target[pos++] = 0x1F74; 2984 break; 2985 2986 case 0x1FCB : 2987 target[pos++] = 0x1F75; 2988 break; 2989 2990 case 0x1FCC : 2991 target[pos++] = 0x03B7; 2992 target[pos++] = 0x03B9; 2993 break; 2994 2995 case 0x1FD2 : 2996 target[pos++] = 0x03B9; 2997 target[pos++] = 0x0308; 2998 target[pos++] = 0x0300; 2999 break; 3000 3001 case 0x1FD3 : 3002 target[pos++] = 0x03B9; 3003 target[pos++] = 0x0308; 3004 target[pos++] = 0x0301; 3005 break; 3006 3007 case 0x1FD6 : 3008 target[pos++] = 0x03B9; 3009 target[pos++] = 0x0342; 3010 break; 3011 3012 case 0x1FD7 : 3013 target[pos++] = 0x03B9; 3014 target[pos++] = 0x0308; 3015 target[pos++] = 0x0342; 3016 break; 3017 3018 case 0x1FD8 : 3019 target[pos++] = 0x1FD0; 3020 break; 3021 3022 case 0x1FD9 : 3023 target[pos++] = 0x1FD1; 3024 break; 3025 3026 case 0x1FDA : 3027 target[pos++] = 0x1F76; 3028 break; 3029 3030 case 0x1FDB : 3031 target[pos++] = 0x1F77; 3032 break; 3033 3034 case 0x1FE2 : 3035 target[pos++] = 0x03C5; 3036 target[pos++] = 0x0308; 3037 target[pos++] = 0x0300; 3038 break; 3039 3040 case 0x1FE3 : 3041 target[pos++] = 0x03C5; 3042 target[pos++] = 0x0308; 3043 target[pos++] = 0x0301; 3044 break; 3045 3046 case 0x1FE4 : 3047 target[pos++] = 0x03C1; 3048 target[pos++] = 0x0313; 3049 break; 3050 3051 case 0x1FE6 : 3052 target[pos++] = 0x03C5; 3053 target[pos++] = 0x0342; 3054 break; 3055 3056 case 0x1FE7 : 3057 target[pos++] = 0x03C5; 3058 target[pos++] = 0x0308; 3059 target[pos++] = 0x0342; 3060 break; 3061 3062 case 0x1FE8 : 3063 target[pos++] = 0x1FE0; 3064 break; 3065 3066 case 0x1FE9 : 3067 target[pos++] = 0x1FE1; 3068 break; 3069 3070 case 0x1FEA : 3071 target[pos++] = 0x1F7A; 3072 break; 3073 3074 case 0x1FEB : 3075 target[pos++] = 0x1F7B; 3076 break; 3077 3078 case 0x1FEC : 3079 target[pos++] = 0x1FE5; 3080 break; 3081 3082 case 0x1FF2 : 3083 target[pos++] = 0x1F7C; 3084 target[pos++] = 0x03B9; 3085 break; 3086 3087 case 0x1FF3 : 3088 target[pos++] = 0x03C9; 3089 target[pos++] = 0x03B9; 3090 break; 3091 3092 case 0x1FF4 : 3093 target[pos++] = 0x03CE; 3094 target[pos++] = 0x03B9; 3095 break; 3096 3097 case 0x1FF6 : 3098 target[pos++] = 0x03C9; 3099 target[pos++] = 0x0342; 3100 break; 3101 3102 case 0x1FF7 : 3103 target[pos++] = 0x03C9; 3104 target[pos++] = 0x0342; 3105 target[pos++] = 0x03B9; 3106 break; 3107 3108 case 0x1FF8 : 3109 target[pos++] = 0x1F78; 3110 break; 3111 3112 case 0x1FF9 : 3113 target[pos++] = 0x1F79; 3114 break; 3115 3116 case 0x1FFA : 3117 target[pos++] = 0x1F7C; 3118 break; 3119 3120 case 0x1FFB : 3121 target[pos++] = 0x1F7D; 3122 break; 3123 3124 case 0x1FFC : 3125 target[pos++] = 0x03C9; 3126 target[pos++] = 0x03B9; 3127 break; 3128 3129 case 0x2000 : 3130 case 0x2001 : 3131 case 0x2002 : 3132 case 0x2003 : 3133 case 0x2004 : 3134 case 0x2005 : 3135 case 0x2006 : 3136 case 0x2007 : 3137 case 0x2008 : 3138 case 0x2009 : 3139 case 0x200A : 3140 target[pos++] = 0x0020; 3141 break; 3142 3143 case 0x200B : 3144 case 0x200C : 3145 case 0x200D : 3146 case 0x200E : 3147 case 0x200F : 3148 break; 3149 3150 case 0x2028 : 3151 case 0x2029 : 3152 target[pos++] = 0x0020; 3153 break; 3154 3155 case 0x202A : 3156 case 0x202B : 3157 case 0x202C : 3158 case 0x202D : 3159 case 0x202E : 3160 break; 3161 3162 case 0x202F : 3163 target[pos++] = 0x0020; 3164 break; 3165 3166 case 0x205F : 3167 target[pos++] = 0x0020; 3168 break; 3169 3170 case 0x2060 : 3171 case 0x2061 : 3172 case 0x2062 : 3173 case 0x2063 : 3174 break; 3175 3176 case 0x206A : 3177 case 0x206B : 3178 case 0x206C : 3179 case 0x206D : 3180 case 0x206E : 3181 case 0x206F : 3182 break; 3183 3184 case 0x20A8 : 3185 target[pos++] = 0x0072; 3186 target[pos++] = 0x0073; 3187 break; 3188 3189 case 0x2102 : 3190 target[pos++] = 0x0063; 3191 break; 3192 3193 case 0x2103 : 3194 target[pos++] = 0x00B0; 3195 target[pos++] = 0x0063; 3196 break; 3197 3198 case 0x2107 : 3199 target[pos++] = 0x025B; 3200 break; 3201 3202 case 0x2109 : 3203 target[pos++] = 0x00B0; 3204 target[pos++] = 0x0066; 3205 break; 3206 3207 case 0x210B : 3208 target[pos++] = 0x0068; 3209 break; 3210 3211 case 0x210C : 3212 target[pos++] = 0x0068; 3213 break; 3214 3215 case 0x210D : 3216 target[pos++] = 0x0068; 3217 break; 3218 3219 case 0x2110 : 3220 target[pos++] = 0x0069; 3221 break; 3222 3223 case 0x2111 : 3224 target[pos++] = 0x0069; 3225 break; 3226 3227 case 0x2112 : 3228 target[pos++] = 0x006C; 3229 break; 3230 3231 case 0x2115 : 3232 target[pos++] = 0x006E; 3233 break; 3234 3235 case 0x2116 : 3236 target[pos++] = 0x006E; 3237 target[pos++] = 0x006F; 3238 break; 3239 3240 case 0x2119 : 3241 target[pos++] = 0x0070; 3242 break; 3243 3244 case 0x211A : 3245 target[pos++] = 0x0071; 3246 break; 3247 3248 case 0x211B : 3249 target[pos++] = 0x0072; 3250 break; 3251 3252 case 0x211C : 3253 target[pos++] = 0x0072; 3254 break; 3255 3256 case 0x211D : 3257 target[pos++] = 0x0072; 3258 break; 3259 3260 case 0x2120 : 3261 target[pos++] = 0x0073; 3262 target[pos++] = 0x006D; 3263 break; 3264 3265 case 0x2121 : 3266 target[pos++] = 0x0074; 3267 target[pos++] = 0x0065; 3268 target[pos++] = 0x006C; 3269 break; 3270 3271 case 0x2122 : 3272 target[pos++] = 0x0074; 3273 target[pos++] = 0x006D; 3274 break; 3275 3276 case 0x2124 : 3277 target[pos++] = 0x007A; 3278 break; 3279 3280 case 0x2126 : 3281 target[pos++] = 0x03C9; 3282 break; 3283 3284 case 0x2128 : 3285 target[pos++] = 0x007A; 3286 break; 3287 3288 case 0x212A : 3289 target[pos++] = 0x006B; 3290 break; 3291 3292 case 0x212B : 3293 target[pos++] = 0x00E5; 3294 break; 3295 3296 case 0x212C : 3297 target[pos++] = 0x0062; 3298 break; 3299 3300 case 0x212D : 3301 target[pos++] = 0x0063; 3302 break; 3303 3304 case 0x2130 : 3305 target[pos++] = 0x0065; 3306 break; 3307 3308 case 0x2131 : 3309 target[pos++] = 0x0066; 3310 break; 3311 3312 case 0x2133 : 3313 target[pos++] = 0x006D; 3314 break; 3315 3316 case 0x213E : 3317 target[pos++] = 0x03B3; 3318 break; 3319 3320 case 0x213F : 3321 target[pos++] = 0x03C0; 3322 break; 3323 3324 case 0x2145 : 3325 target[pos++] = 0x0064; 3326 break; 3327 3328 case 0x2160 : 3329 target[pos++] = 0x2170; 3330 break; 3331 3332 case 0x2161 : 3333 target[pos++] = 0x2171; 3334 break; 3335 3336 case 0x2162 : 3337 target[pos++] = 0x2172; 3338 break; 3339 3340 case 0x2163 : 3341 target[pos++] = 0x2173; 3342 break; 3343 3344 case 0x2164 : 3345 target[pos++] = 0x2174; 3346 break; 3347 3348 case 0x2165 : 3349 target[pos++] = 0x2175; 3350 break; 3351 3352 case 0x2166 : 3353 target[pos++] = 0x2176; 3354 break; 3355 3356 case 0x2167 : 3357 target[pos++] = 0x2177; 3358 break; 3359 3360 case 0x2168 : 3361 target[pos++] = 0x2178; 3362 break; 3363 3364 case 0x2169 : 3365 target[pos++] = 0x2179; 3366 break; 3367 3368 case 0x216A : 3369 target[pos++] = 0x217A; 3370 break; 3371 3372 case 0x216B : 3373 target[pos++] = 0x217B; 3374 break; 3375 3376 case 0x216C : 3377 target[pos++] = 0x217C; 3378 break; 3379 3380 case 0x216D : 3381 target[pos++] = 0x217D; 3382 break; 3383 3384 case 0x216E : 3385 target[pos++] = 0x217E; 3386 break; 3387 3388 case 0x216F : 3389 target[pos++] = 0x217F; 3390 break; 3391 3392 case 0x24B6 : 3393 target[pos++] = 0x24D0; 3394 break; 3395 3396 case 0x24B7 : 3397 target[pos++] = 0x24D1; 3398 break; 3399 3400 case 0x24B8 : 3401 target[pos++] = 0x24D2; 3402 break; 3403 3404 case 0x24B9 : 3405 target[pos++] = 0x24D3; 3406 break; 3407 3408 case 0x24BA : 3409 target[pos++] = 0x24D4; 3410 break; 3411 3412 case 0x24BB : 3413 target[pos++] = 0x24D5; 3414 break; 3415 3416 case 0x24BC : 3417 target[pos++] = 0x24D6; 3418 break; 3419 3420 case 0x24BD : 3421 target[pos++] = 0x24D7; 3422 break; 3423 3424 case 0x24BE : 3425 target[pos++] = 0x24D8; 3426 break; 3427 3428 case 0x24BF : 3429 target[pos++] = 0x24D9; 3430 break; 3431 3432 case 0x24C0 : 3433 target[pos++] = 0x24DA; 3434 break; 3435 3436 case 0x24C1 : 3437 target[pos++] = 0x24DB; 3438 break; 3439 3440 case 0x24C2 : 3441 target[pos++] = 0x24DC; 3442 break; 3443 3444 case 0x24C3 : 3445 target[pos++] = 0x24DD; 3446 break; 3447 3448 case 0x24C4 : 3449 target[pos++] = 0x24DE; 3450 break; 3451 3452 case 0x24C5 : 3453 target[pos++] = 0x24DF; 3454 break; 3455 3456 case 0x24C6 : 3457 target[pos++] = 0x24E0; 3458 break; 3459 3460 case 0x24C7 : 3461 target[pos++] = 0x24E1; 3462 break; 3463 3464 case 0x24C8 : 3465 target[pos++] = 0x24E2; 3466 break; 3467 3468 case 0x24C9 : 3469 target[pos++] = 0x24E3; 3470 break; 3471 3472 case 0x24CA : 3473 target[pos++] = 0x24E4; 3474 break; 3475 3476 case 0x24CB : 3477 target[pos++] = 0x24E5; 3478 break; 3479 3480 case 0x24CC : 3481 target[pos++] = 0x24E6; 3482 break; 3483 3484 case 0x24CD : 3485 target[pos++] = 0x24E7; 3486 break; 3487 3488 case 0x24CE : 3489 target[pos++] = 0x24E8; 3490 break; 3491 3492 case 0x24CF : 3493 target[pos++] = 0x24E9; 3494 break; 3495 3496 case 0x3000 : 3497 target[pos++] = 0x0020; 3498 break; 3499 3500 case 0x3371 : 3501 target[pos++] = 0x0068; 3502 target[pos++] = 0x0070; 3503 target[pos++] = 0x0061; 3504 break; 3505 3506 case 0x3373 : 3507 target[pos++] = 0x0061; 3508 target[pos++] = 0x0075; 3509 break; 3510 3511 case 0x3375 : 3512 target[pos++] = 0x006F; 3513 target[pos++] = 0x0076; 3514 break; 3515 3516 case 0x3380 : 3517 target[pos++] = 0x0070; 3518 target[pos++] = 0x0061; 3519 break; 3520 3521 case 0x3381 : 3522 target[pos++] = 0x006E; 3523 target[pos++] = 0x0061; 3524 break; 3525 3526 case 0x3382 : 3527 target[pos++] = 0x03BC; 3528 target[pos++] = 0x0061; 3529 break; 3530 3531 case 0x3383 : 3532 target[pos++] = 0x006D; 3533 target[pos++] = 0x0061; 3534 break; 3535 3536 case 0x3384 : 3537 target[pos++] = 0x006B; 3538 target[pos++] = 0x0061; 3539 break; 3540 3541 case 0x3385 : 3542 target[pos++] = 0x006B; 3543 target[pos++] = 0x0062; 3544 break; 3545 3546 case 0x3386 : 3547 target[pos++] = 0x006D; 3548 target[pos++] = 0x0062; 3549 break; 3550 3551 case 0x3387 : 3552 target[pos++] = 0x0067; 3553 target[pos++] = 0x0062; 3554 break; 3555 3556 case 0x338A : 3557 target[pos++] = 0x0070; 3558 target[pos++] = 0x0066; 3559 break; 3560 3561 case 0x338B : 3562 target[pos++] = 0x006E; 3563 target[pos++] = 0x0066; 3564 break; 3565 3566 case 0x338C : 3567 target[pos++] = 0x03BC; 3568 target[pos++] = 0x0066; 3569 break; 3570 3571 case 0x3390 : 3572 target[pos++] = 0x0068; 3573 target[pos++] = 0x007A; 3574 break; 3575 3576 case 0x3391 : 3577 target[pos++] = 0x006B; 3578 target[pos++] = 0x0068; 3579 target[pos++] = 0x007A; 3580 break; 3581 3582 case 0x3392 : 3583 target[pos++] = 0x006D; 3584 target[pos++] = 0x0068; 3585 target[pos++] = 0x007A; 3586 break; 3587 3588 case 0x3393 : 3589 target[pos++] = 0x0067; 3590 target[pos++] = 0x0068; 3591 target[pos++] = 0x007A; 3592 break; 3593 3594 case 0x3394 : 3595 target[pos++] = 0x0074; 3596 target[pos++] = 0x0068; 3597 target[pos++] = 0x007A; 3598 break; 3599 3600 case 0x33A9 : 3601 target[pos++] = 0x0070; 3602 target[pos++] = 0x0061; 3603 break; 3604 3605 case 0x33AA : 3606 target[pos++] = 0x006B; 3607 target[pos++] = 0x0070; 3608 target[pos++] = 0x0061; 3609 break; 3610 3611 case 0x33AB : 3612 target[pos++] = 0x006D; 3613 target[pos++] = 0x0070; 3614 target[pos++] = 0x0061; 3615 break; 3616 3617 case 0x33AC : 3618 target[pos++] = 0x0067; 3619 target[pos++] = 0x0070; 3620 target[pos++] = 0x0061; 3621 break; 3622 3623 case 0x33B4 : 3624 target[pos++] = 0x0070; 3625 target[pos++] = 0x0076; 3626 break; 3627 3628 case 0x33B5 : 3629 target[pos++] = 0x006E; 3630 target[pos++] = 0x0076; 3631 break; 3632 3633 case 0x33B6 : 3634 target[pos++] = 0x03BC; 3635 target[pos++] = 0x0076; 3636 break; 3637 3638 case 0x33B7 : 3639 target[pos++] = 0x006D; 3640 target[pos++] = 0x0076; 3641 break; 3642 3643 case 0x33B8 : 3644 target[pos++] = 0x006B; 3645 target[pos++] = 0x0076; 3646 break; 3647 3648 case 0x33B9 : 3649 target[pos++] = 0x006D; 3650 target[pos++] = 0x0076; 3651 break; 3652 3653 case 0x33BA : 3654 target[pos++] = 0x0070; 3655 target[pos++] = 0x0077; 3656 break; 3657 3658 case 0x33BB : 3659 target[pos++] = 0x006E; 3660 target[pos++] = 0x0077; 3661 break; 3662 3663 case 0x33BC : 3664 target[pos++] = 0x03BC; 3665 target[pos++] = 0x0077; 3666 break; 3667 3668 case 0x33BD : 3669 target[pos++] = 0x006D; 3670 target[pos++] = 0x0077; 3671 break; 3672 3673 case 0x33BE : 3674 target[pos++] = 0x006B; 3675 target[pos++] = 0x0077; 3676 break; 3677 3678 case 0x33BF : 3679 target[pos++] = 0x006D; 3680 target[pos++] = 0x0077; 3681 break; 3682 3683 case 0x33C0 : 3684 target[pos++] = 0x006B; 3685 target[pos++] = 0x03C9; 3686 break; 3687 3688 case 0x33C1 : 3689 target[pos++] = 0x006D; 3690 target[pos++] = 0x03C9; 3691 break; 3692 3693 case 0x33C3 : 3694 target[pos++] = 0x0062; 3695 target[pos++] = 0x0071; 3696 break; 3697 3698 case 0x33C6 : 3699 target[pos++] = 0x0063; 3700 target[pos++] = 0x2215; 3701 target[pos++] = 0x006B; 3702 target[pos++] = 0x0067; 3703 break; 3704 3705 case 0x33C7 : 3706 target[pos++] = 0x0063; 3707 target[pos++] = 0x006F; 3708 target[pos++] = 0x002E; 3709 break; 3710 3711 case 0x33C8 : 3712 target[pos++] = 0x0064; 3713 target[pos++] = 0x0062; 3714 break; 3715 3716 case 0x33C9 : 3717 target[pos++] = 0x0067; 3718 target[pos++] = 0x0079; 3719 break; 3720 3721 case 0x33CB : 3722 target[pos++] = 0x0068; 3723 target[pos++] = 0x0070; 3724 break; 3725 3726 case 0x33CD : 3727 target[pos++] = 0x006B; 3728 target[pos++] = 0x006B; 3729 break; 3730 3731 case 0x33CE : 3732 target[pos++] = 0x006B; 3733 target[pos++] = 0x006D; 3734 break; 3735 3736 case 0x33D7 : 3737 target[pos++] = 0x0070; 3738 target[pos++] = 0x0068; 3739 break; 3740 3741 case 0x33D9 : 3742 target[pos++] = 0x0070; 3743 target[pos++] = 0x0070; 3744 target[pos++] = 0x006D; 3745 break; 3746 3747 case 0x33DA : 3748 target[pos++] = 0x0070; 3749 target[pos++] = 0x0072; 3750 break; 3751 3752 case 0x33DC : 3753 target[pos++] = 0x0073; 3754 target[pos++] = 0x0076; 3755 break; 3756 3757 case 0x33DD : 3758 target[pos++] = 0x0077; 3759 target[pos++] = 0x0062; 3760 break; 3761 3762 case 0xFB00 : 3763 target[pos++] = 0x0066; 3764 target[pos++] = 0x0066; 3765 break; 3766 3767 case 0xFB01 : 3768 target[pos++] = 0x0066; 3769 target[pos++] = 0x0069; 3770 break; 3771 3772 case 0xFB02 : 3773 target[pos++] = 0x0066; 3774 target[pos++] = 0x006C; 3775 break; 3776 3777 case 0xFB03 : 3778 target[pos++] = 0x0066; 3779 target[pos++] = 0x0066; 3780 target[pos++] = 0x0069; 3781 break; 3782 3783 case 0xFB04 : 3784 target[pos++] = 0x0066; 3785 target[pos++] = 0x0066; 3786 target[pos++] = 0x006C; 3787 break; 3788 3789 case 0xFB05 : 3790 target[pos++] = 0x0073; 3791 target[pos++] = 0x0074; 3792 break; 3793 3794 case 0xFB06 : 3795 target[pos++] = 0x0073; 3796 target[pos++] = 0x0074; 3797 break; 3798 3799 case 0xFB13 : 3800 target[pos++] = 0x0574; 3801 target[pos++] = 0x0576; 3802 break; 3803 3804 case 0xFB14 : 3805 target[pos++] = 0x0574; 3806 target[pos++] = 0x0565; 3807 break; 3808 3809 case 0xFB15 : 3810 target[pos++] = 0x0574; 3811 target[pos++] = 0x056B; 3812 break; 3813 3814 case 0xFB16 : 3815 target[pos++] = 0x057E; 3816 target[pos++] = 0x0576; 3817 break; 3818 3819 case 0xFB17 : 3820 target[pos++] = 0x0574; 3821 target[pos++] = 0x056D; 3822 break; 3823 3824 case 0xFE00 : 3825 case 0xFE01 : 3826 case 0xFE02 : 3827 case 0xFE03 : 3828 case 0xFE04 : 3829 case 0xFE05 : 3830 case 0xFE06 : 3831 case 0xFE07 : 3832 case 0xFE08 : 3833 case 0xFE09 : 3834 case 0xFE0A : 3835 case 0xFE0B : 3836 case 0xFE0C : 3837 case 0xFE0D : 3838 case 0xFE0E : 3839 case 0xFE0F : 3840 break; 3841 3842 case 0xFEFF : 3843 break; 3844 3845 case 0xFF21 : 3846 target[pos++] = 0xFF41; 3847 break; 3848 3849 case 0xFF22 : 3850 target[pos++] = 0xFF42; 3851 break; 3852 3853 case 0xFF23 : 3854 target[pos++] = 0xFF43; 3855 break; 3856 3857 case 0xFF24 : 3858 target[pos++] = 0xFF44; 3859 break; 3860 3861 case 0xFF25 : 3862 target[pos++] = 0xFF45; 3863 break; 3864 3865 case 0xFF26 : 3866 target[pos++] = 0xFF46; 3867 break; 3868 3869 case 0xFF27 : 3870 target[pos++] = 0xFF47; 3871 break; 3872 3873 case 0xFF28 : 3874 target[pos++] = 0xFF48; 3875 break; 3876 3877 case 0xFF29 : 3878 target[pos++] = 0xFF49; 3879 break; 3880 3881 case 0xFF2A : 3882 target[pos++] = 0xFF4A; 3883 break; 3884 3885 case 0xFF2B : 3886 target[pos++] = 0xFF4B; 3887 break; 3888 3889 case 0xFF2C : 3890 target[pos++] = 0xFF4C; 3891 break; 3892 3893 case 0xFF2D : 3894 target[pos++] = 0xFF4D; 3895 break; 3896 3897 case 0xFF2E : 3898 target[pos++] = 0xFF4E; 3899 break; 3900 3901 case 0xFF2F : 3902 target[pos++] = 0xFF4F; 3903 break; 3904 3905 case 0xFF30 : 3906 target[pos++] = 0xFF50; 3907 break; 3908 3909 case 0xFF31 : 3910 target[pos++] = 0xFF51; 3911 break; 3912 3913 case 0xFF32 : 3914 target[pos++] = 0xFF52; 3915 break; 3916 3917 case 0xFF33 : 3918 target[pos++] = 0xFF53; 3919 break; 3920 3921 case 0xFF34 : 3922 target[pos++] = 0xFF54; 3923 break; 3924 3925 case 0xFF35 : 3926 target[pos++] = 0xFF55; 3927 break; 3928 3929 case 0xFF36 : 3930 target[pos++] = 0xFF56; 3931 break; 3932 3933 case 0xFF37 : 3934 target[pos++] = 0xFF57; 3935 break; 3936 3937 case 0xFF38 : 3938 target[pos++] = 0xFF58; 3939 break; 3940 3941 case 0xFF39 : 3942 target[pos++] = 0xFF59; 3943 break; 3944 3945 case 0xFF3A : 3946 target[pos++] = 0xFF5A; 3947 break; 3948 3949 case 0xFFF9 : 3950 case 0xFFFA : 3951 case 0xFFFB : 3952 case 0xFFFC : 3953 break; 3954 3955 default : 3956 // First, eliminate surrogates, and replace them by FFFD char 3957 if ( ( c >= 0xD800 ) && ( c <= 0xDFFF ) ) 3958 { 3959 target[pos++] = (char)0xFFFD ; 3960 break; 3961 } 3962 3963 target[pos++] = c; 3964 break; 3965 } 3966 3967 return pos - start; 3968 } 3969 3970 /** 3971 * 3972 * Prohibit characters described in RFC 4518 : 3973 * - Table A.1 of RFC 3454 3974 * - Table C.3 of RFC 3454 3975 * - Table C.4 of RFC 3454 3976 * - Table C.5 of RFC 3454 3977 * - Table C.8 of RFC 3454 3978 * - character U-FFFD 3979 * 3980 * @param c The char to analyze 3981 * @throws InvalidCharacterException If any character is prohibited 3982 */ 3983 private static void checkProhibited( char c ) throws InvalidCharacterException 3984 { 3985 // Shortcut chars above 0x0221 3986 if ( c < 0x221 ) 3987 { 3988 return; 3989 } 3990 3991 // RFC 3454, Table A.1 3992 switch ( c ) 3993 { 3994 case 0x0221 : 3995 case 0x038B : 3996 case 0x038D : 3997 case 0x03A2 : 3998 case 0x03CF : 3999 case 0x0487 : 4000 case 0x04CF : 4001 case 0x0560 : 4002 case 0x0588 : 4003 case 0x05A2 : 4004 case 0x05BA : 4005 case 0x0620 : 4006 case 0x06FF : 4007 case 0x070E : 4008 case 0x0904 : 4009 case 0x0984 : 4010 case 0x09A9 : 4011 case 0x09B1 : 4012 case 0x09BD : 4013 case 0x09DE : 4014 case 0x0A29 : 4015 case 0x0A31 : 4016 case 0x0A34 : 4017 case 0x0A37 : 4018 case 0x0A3D : 4019 case 0x0A5D : 4020 case 0x0A84 : 4021 case 0x0A8C : 4022 case 0x0A8E : 4023 case 0x0A92 : 4024 case 0x0AA9 : 4025 case 0x0AB1 : 4026 case 0x0AB4 : 4027 case 0x0AC6 : 4028 case 0x0ACA : 4029 case 0x0B04 : 4030 case 0x0B29 : 4031 case 0x0B31 : 4032 case 0x0B5E : 4033 case 0x0B84 : 4034 case 0x0B91 : 4035 case 0x0B9B : 4036 case 0x0B9D : 4037 case 0x0BB6 : 4038 case 0x0BC9 : 4039 case 0x0C04 : 4040 case 0x0C0D : 4041 case 0x0C11 : 4042 case 0x0C29 : 4043 case 0x0C34 : 4044 case 0x0C45 : 4045 case 0x0C49 : 4046 case 0x0C84 : 4047 case 0x0C8D : 4048 case 0x0C91 : 4049 case 0x0CA9 : 4050 case 0x0CB4 : 4051 case 0x0CC5 : 4052 case 0x0CC9 : 4053 case 0x0CDF : 4054 case 0x0D04 : 4055 case 0x0D0D : 4056 case 0x0D11 : 4057 case 0x0D29 : 4058 case 0x0D49 : 4059 case 0x0D84 : 4060 case 0x0DB2 : 4061 case 0x0DBC : 4062 case 0x0DD5 : 4063 case 0x0DD7 : 4064 case 0x0E83 : 4065 case 0x0E89 : 4066 case 0x0E98 : 4067 case 0x0EA0 : 4068 case 0x0EA4 : 4069 case 0x0EA6 : 4070 case 0x0EAC : 4071 case 0x0EBA : 4072 case 0x0EC5 : 4073 case 0x0EC7 : 4074 case 0x0F48 : 4075 case 0x0F98 : 4076 case 0x0FBD : 4077 case 0x1022 : 4078 case 0x1028 : 4079 case 0x102B : 4080 case 0x1207 : 4081 case 0x1247 : 4082 case 0x1249 : 4083 case 0x1257 : 4084 case 0x1259 : 4085 case 0x1287 : 4086 case 0x1289 : 4087 case 0x12AF : 4088 case 0x12B1 : 4089 case 0x12BF : 4090 case 0x12C1 : 4091 case 0x12CF : 4092 case 0x12D7 : 4093 case 0x12EF : 4094 case 0x130F : 4095 case 0x1311 : 4096 case 0x131F : 4097 case 0x1347 : 4098 case 0x170D : 4099 case 0x176D : 4100 case 0x1771 : 4101 case 0x180F : 4102 case 0x1F58 : 4103 case 0x1F5A : 4104 case 0x1F5C : 4105 case 0x1F5E : 4106 case 0x1FB5 : 4107 case 0x1FC5 : 4108 case 0x1FDC : 4109 case 0x1FF5 : 4110 case 0x1FFF : 4111 case 0x24FF : 4112 case 0x2618 : 4113 case 0x2705 : 4114 case 0x2728 : 4115 case 0x274C : 4116 case 0x274E : 4117 case 0x2757 : 4118 case 0x27B0 : 4119 case 0x2E9A : 4120 case 0x3040 : 4121 case 0x318F : 4122 case 0x32FF : 4123 case 0x33FF : 4124 case 0xFB37 : 4125 case 0xFB3D : 4126 case 0xFB3F : 4127 case 0xFB42 : 4128 case 0xFB45 : 4129 case 0xFE53 : 4130 case 0xFE67 : 4131 case 0xFE75 : 4132 case 0xFF00 : 4133 case 0xFFE7 : 4134 throw new InvalidCharacterException( c ); 4135 default: 4136 break; 4137 } 4138 4139 // RFC 3454, Table A.1, intervals 4140 if ( ( c >= 0x0234 ) && ( c <= 0x024F ) ) 4141 { 4142 throw new InvalidCharacterException( c ); 4143 } 4144 4145 if ( ( c >= 0x02AE ) && ( c <= 0x02AF ) ) 4146 { 4147 throw new InvalidCharacterException( c ); 4148 } 4149 4150 if ( ( c >= 0x02EF ) && ( c <= 0x02FF ) ) 4151 { 4152 throw new InvalidCharacterException( c ); 4153 } 4154 4155 if ( ( c >= 0x0350 ) && ( c <= 0x035F ) ) 4156 { 4157 throw new InvalidCharacterException( c ); 4158 } 4159 4160 if ( ( c >= 0x0370 ) && ( c <= 0x0373 ) ) 4161 { 4162 throw new InvalidCharacterException( c ); 4163 } 4164 4165 if ( ( c >= 0x0376 ) && ( c <= 0x0379 ) ) 4166 { 4167 throw new InvalidCharacterException( c ); 4168 } 4169 4170 if ( ( c >= 0x037B ) && ( c <= 0x037D ) ) 4171 { 4172 throw new InvalidCharacterException( c ); 4173 } 4174 4175 if ( ( c >= 0x037F ) && ( c <= 0x0383 ) ) 4176 { 4177 throw new InvalidCharacterException( c ); 4178 } 4179 4180 if ( ( c >= 0x03F7 ) && ( c <= 0x03FF ) ) 4181 { 4182 throw new InvalidCharacterException( c ); 4183 } 4184 4185 if ( ( c >= 0x04F6 ) && ( c <= 0x04F7 ) ) 4186 { 4187 throw new InvalidCharacterException( c ); 4188 } 4189 4190 if ( ( c >= 0x04FA ) && ( c <= 0x04FF ) ) 4191 { 4192 throw new InvalidCharacterException( c ); 4193 } 4194 4195 if ( ( c >= 0x0510 ) && ( c <= 0x0530 ) ) 4196 { 4197 throw new InvalidCharacterException( c ); 4198 } 4199 4200 if ( ( c >= 0x0557 ) && ( c <= 0x0558 ) ) 4201 { 4202 throw new InvalidCharacterException( c ); 4203 } 4204 4205 if ( ( c >= 0x058B ) && ( c <= 0x0590 ) ) 4206 { 4207 throw new InvalidCharacterException( c ); 4208 } 4209 4210 if ( ( c >= 0x05C5 ) && ( c <= 0x05CF ) ) 4211 { 4212 throw new InvalidCharacterException( c ); 4213 } 4214 4215 if ( ( c >= 0x05EB ) && ( c <= 0x05EF ) ) 4216 { 4217 throw new InvalidCharacterException( c ); 4218 } 4219 4220 if ( ( c >= 0x05F5 ) && ( c <= 0x060B ) ) 4221 { 4222 throw new InvalidCharacterException( c ); 4223 } 4224 4225 if ( ( c >= 0x060D ) && ( c <= 0x061A ) ) 4226 { 4227 throw new InvalidCharacterException( c ); 4228 } 4229 4230 if ( ( c >= 0x061C ) && ( c <= 0x061E ) ) 4231 { 4232 throw new InvalidCharacterException( c ); 4233 } 4234 4235 if ( ( c >= 0x063B ) && ( c <= 0x063F ) ) 4236 { 4237 throw new InvalidCharacterException( c ); 4238 } 4239 4240 if ( ( c >= 0x0656 ) && ( c <= 0x065F ) ) 4241 { 4242 throw new InvalidCharacterException( c ); 4243 } 4244 4245 if ( ( c >= 0x06EE ) && ( c <= 0x06EF ) ) 4246 { 4247 throw new InvalidCharacterException( c ); 4248 } 4249 4250 if ( ( c >= 0x072D ) && ( c <= 0x072F ) ) 4251 { 4252 throw new InvalidCharacterException( c ); 4253 } 4254 4255 if ( ( c >= 0x074B ) && ( c <= 0x077F ) ) 4256 { 4257 throw new InvalidCharacterException( c ); 4258 } 4259 4260 if ( ( c >= 0x07B2 ) && ( c <= 0x0900 ) ) 4261 { 4262 throw new InvalidCharacterException( c ); 4263 } 4264 4265 if ( ( c >= 0x093A ) && ( c <= 0x093B ) ) 4266 { 4267 throw new InvalidCharacterException( c ); 4268 } 4269 4270 if ( ( c >= 0x094E ) && ( c <= 0x094F ) ) 4271 { 4272 throw new InvalidCharacterException( c ); 4273 } 4274 4275 if ( ( c >= 0x0955 ) && ( c <= 0x0957 ) ) 4276 { 4277 throw new InvalidCharacterException( c ); 4278 } 4279 4280 if ( ( c >= 0x0971 ) && ( c <= 0x0980 ) ) 4281 { 4282 throw new InvalidCharacterException( c ); 4283 } 4284 4285 if ( ( c >= 0x098D ) && ( c <= 0x098E ) ) 4286 { 4287 throw new InvalidCharacterException( c ); 4288 } 4289 4290 if ( ( c >= 0x0991 ) && ( c <= 0x0992 ) ) 4291 { 4292 throw new InvalidCharacterException( c ); 4293 } 4294 4295 if ( ( c >= 0x09B3 ) && ( c <= 0x09B5 ) ) 4296 { 4297 throw new InvalidCharacterException( c ); 4298 } 4299 4300 if ( ( c >= 0x09BA ) && ( c <= 0x09BB ) ) 4301 { 4302 throw new InvalidCharacterException( c ); 4303 } 4304 4305 if ( ( c >= 0x09C5 ) && ( c <= 0x09C6 ) ) 4306 { 4307 throw new InvalidCharacterException( c ); 4308 } 4309 4310 if ( ( c >= 0x09C9 ) && ( c <= 0x09CA ) ) 4311 { 4312 throw new InvalidCharacterException( c ); 4313 } 4314 4315 if ( ( c >= 0x09CE ) && ( c <= 0x09D6 ) ) 4316 { 4317 throw new InvalidCharacterException( c ); 4318 } 4319 4320 if ( ( c >= 0x09D8 ) && ( c <= 0x09DB ) ) 4321 { 4322 throw new InvalidCharacterException( c ); 4323 } 4324 4325 if ( ( c >= 0x09E4 ) && ( c <= 0x09E5 ) ) 4326 { 4327 throw new InvalidCharacterException( c ); 4328 } 4329 4330 if ( ( c >= 0x09FB ) && ( c <= 0x0A01 ) ) 4331 { 4332 throw new InvalidCharacterException( c ); 4333 } 4334 4335 if ( ( c >= 0x0A03 ) && ( c <= 0x0A04 ) ) 4336 { 4337 throw new InvalidCharacterException( c ); 4338 } 4339 4340 if ( ( c >= 0x0A0B ) && ( c <= 0x0A0E ) ) 4341 { 4342 throw new InvalidCharacterException( c ); 4343 } 4344 4345 if ( ( c >= 0x0A11 ) && ( c <= 0x0A12 ) ) 4346 { 4347 throw new InvalidCharacterException( c ); 4348 } 4349 4350 if ( ( c >= 0x0A3A ) && ( c <= 0x0A3B ) ) 4351 { 4352 throw new InvalidCharacterException( c ); 4353 } 4354 4355 if ( ( c >= 0x0A43 ) && ( c <= 0x0A46 ) ) 4356 { 4357 throw new InvalidCharacterException( c ); 4358 } 4359 4360 if ( ( c >= 0x0A49 ) && ( c <= 0x0A4A ) ) 4361 { 4362 throw new InvalidCharacterException( c ); 4363 } 4364 4365 if ( ( c >= 0x0A4E ) && ( c <= 0x0A58 ) ) 4366 { 4367 throw new InvalidCharacterException( c ); 4368 } 4369 4370 if ( ( c >= 0x0A5F ) && ( c <= 0x0A65 ) ) 4371 { 4372 throw new InvalidCharacterException( c ); 4373 } 4374 4375 if ( ( c >= 0x0A75 ) && ( c <= 0x0A80 ) ) 4376 { 4377 throw new InvalidCharacterException( c ); 4378 } 4379 4380 if ( ( c >= 0x0ABA ) && ( c <= 0x0ABB ) ) 4381 { 4382 throw new InvalidCharacterException( c ); 4383 } 4384 4385 if ( ( c >= 0x0ACE ) && ( c <= 0x0ACF ) ) 4386 { 4387 throw new InvalidCharacterException( c ); 4388 } 4389 4390 if ( ( c >= 0x0AD1 ) && ( c <= 0x0ADF ) ) 4391 { 4392 throw new InvalidCharacterException( c ); 4393 } 4394 4395 if ( ( c >= 0x0AE1 ) && ( c <= 0x0AE5 ) ) 4396 { 4397 throw new InvalidCharacterException( c ); 4398 } 4399 4400 if ( ( c >= 0x0AF0 ) && ( c <= 0x0B00 ) ) 4401 { 4402 throw new InvalidCharacterException( c ); 4403 } 4404 4405 if ( ( c >= 0x0B0D ) && ( c <= 0x0B0E ) ) 4406 { 4407 throw new InvalidCharacterException( c ); 4408 } 4409 4410 if ( ( c >= 0x0B11 ) && ( c <= 0x0B12 ) ) 4411 { 4412 throw new InvalidCharacterException( c ); 4413 } 4414 4415 if ( ( c >= 0x0B34 ) && ( c <= 0x0B35 ) ) 4416 { 4417 throw new InvalidCharacterException( c ); 4418 } 4419 4420 if ( ( c >= 0x0B3A ) && ( c <= 0x0B3B ) ) 4421 { 4422 throw new InvalidCharacterException( c ); 4423 } 4424 4425 if ( ( c >= 0x0B44 ) && ( c <= 0x0B46 ) ) 4426 { 4427 throw new InvalidCharacterException( c ); 4428 } 4429 4430 if ( ( c >= 0x0B49 ) && ( c <= 0x0B4A ) ) 4431 { 4432 throw new InvalidCharacterException( c ); 4433 } 4434 4435 if ( ( c >= 0x0B4E ) && ( c <= 0x0B55 ) ) 4436 { 4437 throw new InvalidCharacterException( c ); 4438 } 4439 4440 if ( ( c >= 0x0B58 ) && ( c <= 0x0B5B ) ) 4441 { 4442 throw new InvalidCharacterException( c ); 4443 } 4444 4445 if ( ( c >= 0x0B62 ) && ( c <= 0x0B65 ) ) 4446 { 4447 throw new InvalidCharacterException( c ); 4448 } 4449 4450 if ( ( c >= 0x0B71 ) && ( c <= 0x0B81 ) ) 4451 { 4452 throw new InvalidCharacterException( c ); 4453 } 4454 4455 if ( ( c >= 0x0B8B ) && ( c <= 0x0B8D ) ) 4456 { 4457 throw new InvalidCharacterException( c ); 4458 } 4459 4460 if ( ( c >= 0x0B96 ) && ( c <= 0x0B98 ) ) 4461 { 4462 throw new InvalidCharacterException( c ); 4463 } 4464 4465 if ( ( c >= 0x0BA0 ) && ( c <= 0x0BA2 ) ) 4466 { 4467 throw new InvalidCharacterException( c ); 4468 } 4469 4470 if ( ( c >= 0x0BA5 ) && ( c <= 0x0BA7 ) ) 4471 { 4472 throw new InvalidCharacterException( c ); 4473 } 4474 4475 if ( ( c >= 0x0BAB ) && ( c <= 0x0BAD ) ) 4476 { 4477 throw new InvalidCharacterException( c ); 4478 } 4479 4480 if ( ( c >= 0x0BBA ) && ( c <= 0x0BBD ) ) 4481 { 4482 throw new InvalidCharacterException( c ); 4483 } 4484 4485 if ( ( c >= 0x0BC3 ) && ( c <= 0x0BC5 ) ) 4486 { 4487 throw new InvalidCharacterException( c ); 4488 } 4489 4490 if ( ( c >= 0x0BCE ) && ( c <= 0x0BD6 ) ) 4491 { 4492 throw new InvalidCharacterException( c ); 4493 } 4494 4495 if ( ( c >= 0x0BD8 ) && ( c <= 0x0BE6 ) ) 4496 { 4497 throw new InvalidCharacterException( c ); 4498 } 4499 4500 if ( ( c >= 0x0BF3 ) && ( c <= 0x0C00 ) ) 4501 { 4502 throw new InvalidCharacterException( c ); 4503 } 4504 4505 // RFC 3454, Table C.3 4506 if ( ( c >= 0xE000 ) && ( c <= 0xF8FF ) ) 4507 { 4508 throw new InvalidCharacterException( c ); 4509 } 4510 4511 // RFC 3454, Table C.4 4512 if ( ( c >= 0xFDD0 ) && ( c <= 0xFDEF ) ) 4513 { 4514 throw new InvalidCharacterException( c ); 4515 } 4516 4517 if ( ( c == 0xFFFE ) || ( c == 0xFFFF ) ) 4518 { 4519 throw new InvalidCharacterException( c ); 4520 } 4521 4522 // RFC 3454, Table C.5 (Surrogates) 4523 if ( ( c >= 0xD800 ) && ( c <= 0xDFFF ) ) 4524 { 4525 throw new InvalidCharacterException( c ); 4526 } 4527 4528 // RFC 3454, Table C.8 4529 switch ( c) 4530 { 4531 case 0x0340 : // COMBINING GRAVE TONE MARK 4532 case 0x0341 : // COMBINING ACUTE TONE MARK 4533 case 0x200E : // LEFT-TO-RIGHT MARK 4534 case 0x200F : // RIGHT-TO-LEFT MARK 4535 case 0x202A : // LEFT-TO-RIGHT EMBEDDING 4536 case 0x202B : // RIGHT-TO-LEFT EMBEDDING 4537 case 0x202C : // POP DIRECTIONAL FORMATTING 4538 case 0x202D : // LEFT-TO-RIGHT OVERRIDE 4539 case 0x202E : // RIGHT-TO-LEFT OVERRIDE 4540 case 0x206A : // INHIBIT SYMMETRIC SWAPPING 4541 case 0x206B : // ACTIVATE SYMMETRIC SWAPPING 4542 case 0x206C : // INHIBIT ARABIC FORM SHAPING 4543 case 0x206D : // ACTIVATE ARABIC FORM SHAPING 4544 case 0x206E : // NATIONAL DIGIT SHAPES 4545 case 0x206F : // NOMINAL DIGIT SHAPES 4546 throw new InvalidCharacterException( c ); 4547 default : 4548 break; 4549 } 4550 4551 if ( c == 0xFFFD ) 4552 { 4553 throw new InvalidCharacterException( c ); 4554 } 4555 4556 return; 4557 } 4558 4559 /** 4560 * 4561 * Remove all bidirectionnal chars. This is not really clear in RFC 4518 4562 * what we should do with bidi chars : 4563 * "Bidirectional characters are ignored." 4564 * 4565 * But it's not explained what is a bidi chars... 4566 * 4567 * So this method just do nothing atm. 4568 * 4569 * @param str The string where bidi chars are to be removed 4570 * @return The cleaned string 4571 */ 4572 public static String bidi( String str ) 4573 { 4574 return str; 4575 } 4576 4577 /** 4578 * 4579 * Remove all bidirectionnal chars. This is not really clear in RFC 4518 4580 * what we should do with bidi chars : 4581 * "Bidirectional characters are ignored." 4582 * 4583 * But it's not explained what is a bidi chars... 4584 * 4585 * So this method just do nothing atm. 4586 * 4587 * @param array The char array where bidi chars are to be removed 4588 * @return The cleaned StringBuilder 4589 */ 4590 public static StringBuilder bidi( char[] array ) 4591 { 4592 StringBuilder sb = new StringBuilder( array == null ? 0 : array.length ); 4593 4594 if ( array != null ) 4595 { 4596 sb.append( array ); 4597 } 4598 4599 return sb; 4600 } 4601 4602 /** 4603 * 4604 * Remove all insignifiant chars in a Telephone Number : 4605 * Hyphen and spaces. 4606 * 4607 * For instance, the following telephone number : 4608 * "+ (33) 1-123--456 789" 4609 * will be trasnformed to : 4610 * "+(33)1123456789" 4611 * 4612 * @param str The telephone number 4613 * @return The modified telephone number String 4614 */ 4615 private static String insignifiantCharTelephoneNumber( String str ) 4616 { 4617 if ( StringTools.isEmpty( str ) ) 4618 { 4619 return ""; 4620 } 4621 4622 char[] array = str.toCharArray(); 4623 4624 boolean isSpaceOrHyphen = false; 4625 char soh = '\0'; 4626 int pos = 0; 4627 4628 for ( char c:array ) 4629 { 4630 switch ( c ) 4631 { 4632 case 0x0020 : // SPACE 4633 case 0x002D : // HYPHEN-MINUS 4634 case 0x058A : // ARMENIAN HYPHEN 4635 case 0x2010 : // HYPHEN 4636 case 0x2011 : // NON-BREAKING HYPHEN 4637 case 0x2212 : // MINUS SIGN 4638 case 0xFE63 : // SMALL HYPHEN-MINUS 4639 case 0xFF0D : // FULLWIDTH HYPHEN-MINUS 4640 soh = c; 4641 break; 4642 4643 default : 4644 if ( isSpaceOrHyphen && isCombiningMark( c ) ) 4645 { 4646 array[pos++] = soh; 4647 isSpaceOrHyphen = false; 4648 } 4649 4650 array[pos++] = c; 4651 break; 4652 } 4653 } 4654 4655 return new String( array, 0, pos ); 4656 } 4657 4658 /** 4659 * 4660 * Remove all insignifiant spaces in a numeric string. For 4661 * instance, the following numeric string : 4662 * " 123 456 789 " 4663 * will be transformed to : 4664 * "123456789" 4665 * 4666 * @param str The numeric String 4667 * @return The modified numeric StringBuilder 4668 */ 4669 private static String insignifiantCharNumericString( String str ) 4670 { 4671 if ( StringTools.isEmpty( str ) ) 4672 { 4673 return ""; 4674 } 4675 4676 char[] array = str.toCharArray(); 4677 4678 boolean isSpace = false; 4679 int pos = 0; 4680 4681 for ( char c:array ) 4682 { 4683 if ( c != 0x20 ) 4684 { 4685 if ( isSpace && isCombiningMark( c ) ) 4686 { 4687 array[pos++] = ' '; 4688 isSpace = false; 4689 } 4690 4691 array[pos++] = c; 4692 } 4693 else 4694 { 4695 isSpace = true; 4696 } 4697 } 4698 4699 return new String( array, 0, pos ); 4700 } 4701 4702 /** 4703 * 4704 * Remove all insignifiant spaces in a string. 4705 * 4706 * This method use a finite state machine to parse 4707 * the text. 4708 * 4709 * @param str The String to modify 4710 * @param caseSensitive A flag telling if the chars must be lowercased 4711 * @return The modified StringBuilder 4712 * @throws InvalidCharacterException If an invalid character is found in the String 4713 */ 4714 private static String insignifiantSpacesString( String str, boolean caseSensitive ) throws InvalidCharacterException 4715 { 4716 if ( StringTools.isEmpty( str ) ) 4717 { 4718 // Special case : an empty strings is replaced by 2 spaces 4719 return ""; 4720 } 4721 4722 char[] array = str.toCharArray(); 4723 4724 // Create a target char array which is 3 times bigger than the original size. 4725 // We have to do that because the map phase may transform a char to 4726 // three chars. 4727 // TODO : we have to find a way to prevent this waste of space. 4728 char[] target = new char[ str.length() * 3 + 2 ]; 4729 4730 int pos = 0; 4731 char lowerCase = (char)( caseSensitive ? 0x00 : 0x20 ); 4732 4733 // First pass to map the chars 4734 for ( char c:array ) 4735 { 4736 pos += map( c, target, pos, lowerCase ); 4737 } 4738 4739 int limit = pos; 4740 pos = 0; 4741 4742 // Second pass to remove spaces. We work on the target 4743 int i = 0; 4744 char c = '\0'; 4745 4746 // First remove starting spaces 4747 for ( i=0; i < limit; i++ ) 4748 { 4749 c = target[i]; 4750 4751 if ( c != ' ' ) 4752 { 4753 checkProhibited( c ); 4754 break; 4755 } 4756 } 4757 4758 // Now, 'i' will be the starting point. We will just handle the special 4759 // case of a combining character 4760 int start = i; 4761 4762 if ( start == limit ) 4763 { 4764 // we only have spaces 4765 return ""; 4766 } 4767 else if ( isCombiningMark( c ) ) 4768 { 4769 if ( start == 0 ) 4770 { 4771 // The first char can't be a combining char 4772 throw new InvalidCharacterException( c ); 4773 } 4774 else 4775 { 4776 target[pos++] = ' '; 4777 target[pos++] = c; 4778 start++; 4779 } 4780 } 4781 else 4782 { 4783 target[pos++] = c; 4784 start++; 4785 } 4786 4787 // Now remove the spaces at the end 4788 for ( i = limit-1; i > start; i-- ) 4789 { 4790 if ( target[i] != ' ' ) 4791 { 4792 break; 4793 } 4794 } 4795 4796 limit = i + 1; 4797 4798 // Let's deal with the following chars. It will be 4799 // a list of chars and spaces. We will consider that 4800 // we have couples of chars and spaces : 4801 // (char * space*)*. We have a special case : 4802 // a space followed by a combining char. 4803 boolean spaceSeen = false; 4804 boolean space2Seen = false; 4805 4806 for ( i = start; i < limit; i++ ) 4807 { 4808 c = target[i]; 4809 4810 checkProhibited( c ); 4811 4812 if ( isCombiningMark( c ) ) 4813 { 4814 if ( spaceSeen ) 4815 { 4816 if ( space2Seen ) 4817 { 4818 target[pos++] = ' '; 4819 } 4820 4821 target[pos++] = ' '; 4822 target[pos++] = c; 4823 spaceSeen = false; 4824 space2Seen = false; 4825 } 4826 else 4827 { 4828 target[pos++] = c; 4829 } 4830 } 4831 else if ( c == ' ' ) 4832 { 4833 if ( spaceSeen ) 4834 { 4835 space2Seen = true; 4836 } 4837 else 4838 { 4839 spaceSeen = true; 4840 } 4841 } 4842 else 4843 { 4844 if ( spaceSeen ) 4845 { 4846 target[pos++] = ' '; 4847 spaceSeen = false; 4848 space2Seen = false; 4849 } 4850 4851 target[pos++] = c; 4852 } 4853 } 4854 4855 return new String( target, 0, pos ); 4856 } 4857 }