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