forked from mplatt/fold-to-ascii
/
fold-to-ascii.js
2059 lines (2046 loc) · 87.6 KB
/
fold-to-ascii.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/**
* fold-to-ascii.js
* https://github.com/mplatt/fold-to-ascii-js
*
* This is a JavaScript port of the Apache Lucene ASCII Folding Filter.
*
* The Apache Lucene ASCII Folding Filter is licensed to the Apache Software
* Foundation (ASF) under one or more contributor license agreements. See the
* NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache
* License, Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* This port uses an example from the Mozilla Developer Network published prior
* to August 20, 2010
*
* fixedCharCodeAt is licencesed under the MIT License (MIT)
*
* Copyright (c) 2013 Mozilla Developer Network and individual contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
(function() {
/*
* True if unmapped non-ASCII characters should be replaced by the
* default-string.
* False if unmapped characters should remain in the output string.
*/
var replaceUnmapped = true;
/*
* Default string to replace unmapped characters with
*/
var defaultString = "_";
String.prototype.foldToASCII = function() {
return foldToASCII(this);
};
foldToASCII = function(inStr) {
if (inStr === null) {
return "";
}
/*
* The array of characters or character combinations to output
*/
var outStr = "";
for (var i = 0; i < inStr.length; i++) {
var charCode = fixedCharCodeAt(inStr, i);
/*
* Skip low surrogates
*/
if (charCode) {
if (charCode < 128) {
/*
* Character within the ASCII range.
* Copy it to the output string.
*/
outStr += String.fromCharCode(charCode);
} else {
/*
* Character outside of the ASCII range.
* Look for a replacement
*/
outStr += replaceChar(charCode);
}
}
}
return outStr;
};
var fixedCharCodeAt = function(str, idx) {
/*
* ex. fixedCharCodeAt ('\uD800\uDC00', 0); // 65536
* ex. fixedCharCodeAt ('\uD800\uDC00', 1); // 65536
*/
idx = idx || 0;
var code = str.charCodeAt(idx);
var hi, low;
/*
* High surrogate (could change last hex to 0xDB7F to treat high
* private surrogates as single characters)
*/
if (0xD800 <= code && code <= 0xDBFF) {
hi = code;
low = str.charCodeAt(idx + 1);
if (isNaN(low)) {
throw 'High surrogate not followed by low surrogate in fixedCharCodeAt()';
}
return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
}
if (0xDC00 <= code && code <= 0xDFFF) {
/*
* Low surrogate: We return false to allow loops to skip this
* iteration since should have already handled high surrogate above
* in the previous iteration
*/
return false;
/*
* hi = str.charCodeAt(idx-1); low = code; return ((hi - 0xD800) *
* 0x400) + (low - 0xDC00) + 0x10000;
*/
}
return code;
};
/*
* Replaces a character with an ASCII compliant character or
* character-combination.
*/
var replaceChar = function(charCode) {
var outString = "";
switch (charCode) {
case 0xC0: // À [LATIN CAPITAL LETTER A WITH GRAVE]
case 0xC1: // Á [LATIN CAPITAL LETTER A WITH ACUTE]
case 0xC2: // Â [LATIN CAPITAL LETTER A WITH CIRCUMFLEX]
case 0xC3: // Ã [LATIN CAPITAL LETTER A WITH TILDE]
case 0xC4: // Ä [LATIN CAPITAL LETTER A WITH DIAERESIS]
case 0xC5: // Å [LATIN CAPITAL LETTER A WITH RING ABOVE]
case 0x100: // Ā [LATIN CAPITAL LETTER A WITH MACRON]
case 0x102: // Ă [LATIN CAPITAL LETTER A WITH BREVE]
case 0x104: // Ą [LATIN CAPITAL LETTER A WITH OGONEK]
case 0x18F: // Ə http://en.wikipedia.org/wiki/Schwa [LATIN CAPITAL LETTER SCHWA]
case 0x1CD: // Ǎ [LATIN CAPITAL LETTER A WITH CARON]
case 0x1DE: // Ǟ [LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON]
case 0x1E0: // Ǡ [LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON]
case 0x1FA: // Ǻ [LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE]
case 0x200: // Ȁ [LATIN CAPITAL LETTER A WITH DOUBLE GRAVE]
case 0x202: // Ȃ [LATIN CAPITAL LETTER A WITH INVERTED BREVE]
case 0x226: // Ȧ [LATIN CAPITAL LETTER A WITH DOT ABOVE]
case 0x23A: // Ⱥ [LATIN CAPITAL LETTER A WITH STROKE]
case 0x1D00: // ᴀ [LATIN LETTER SMALL CAPITAL A]
case 0x1E00: // Ḁ [LATIN CAPITAL LETTER A WITH RING BELOW]
case 0x1EA0: // Ạ [LATIN CAPITAL LETTER A WITH DOT BELOW]
case 0x1EA2: // Ả [LATIN CAPITAL LETTER A WITH HOOK ABOVE]
case 0x1EA4: // Ấ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE]
case 0x1EA6: // Ầ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE]
case 0x1EA8: // Ẩ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
case 0x1EAA: // Ẫ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE]
case 0x1EAC: // Ậ [LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
case 0x1EAE: // Ắ [LATIN CAPITAL LETTER A WITH BREVE AND ACUTE]
case 0x1EB0: // Ằ [LATIN CAPITAL LETTER A WITH BREVE AND GRAVE]
case 0x1EB2: // Ẳ [LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE]
case 0x1EB4: // Ẵ [LATIN CAPITAL LETTER A WITH BREVE AND TILDE]
case 0x1EB6: // Ặ [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW]
case 0x24B6: // Ⓐ [CIRCLED LATIN CAPITAL LETTER A]
case 0xFF21: // A [FULLWIDTH LATIN CAPITAL LETTER A]
outString += "A";
break;
case 0xE0: // à [LATIN SMALL LETTER A WITH GRAVE]
case 0xE1: // á [LATIN SMALL LETTER A WITH ACUTE]
case 0xE2: // â [LATIN SMALL LETTER A WITH CIRCUMFLEX]
case 0xE3: // ã [LATIN SMALL LETTER A WITH TILDE]
case 0xE4: // ä [LATIN SMALL LETTER A WITH DIAERESIS]
case 0xE5: // å [LATIN SMALL LETTER A WITH RING ABOVE]
case 0x101: // ā [LATIN SMALL LETTER A WITH MACRON]
case 0x103: // ă [LATIN SMALL LETTER A WITH BREVE]
case 0x105: // ą [LATIN SMALL LETTER A WITH OGONEK]
case 0x1CE: // ǎ [LATIN SMALL LETTER A WITH CARON]
case 0x1DF: // ǟ [LATIN SMALL LETTER A WITH DIAERESIS AND MACRON]
case 0x1E1: // ǡ [LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON]
case 0x1FB: // ǻ [LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE]
case 0x201: // ȁ [LATIN SMALL LETTER A WITH DOUBLE GRAVE]
case 0x203: // ȃ [LATIN SMALL LETTER A WITH INVERTED BREVE]
case 0x227: // ȧ [LATIN SMALL LETTER A WITH DOT ABOVE]
case 0x250: // ɐ [LATIN SMALL LETTER TURNED A]
case 0x259: // ə [LATIN SMALL LETTER SCHWA]
case 0x25A: // ɚ [LATIN SMALL LETTER SCHWA WITH HOOK]
case 0x1D8F: // ᶏ [LATIN SMALL LETTER A WITH RETROFLEX HOOK]
case 0x1D95: // ᶕ [LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK]
case 0x1E01: // ạ [LATIN SMALL LETTER A WITH RING BELOW]
case 0x1E9A: // ả [LATIN SMALL LETTER A WITH RIGHT HALF RING]
case 0x1EA1: // ạ [LATIN SMALL LETTER A WITH DOT BELOW]
case 0x1EA3: // ả [LATIN SMALL LETTER A WITH HOOK ABOVE]
case 0x1EA5: // ấ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE]
case 0x1EA7: // ầ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE]
case 0x1EA9: // ẩ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE]
case 0x1EAB: // ẫ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE]
case 0x1EAD: // ậ [LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW]
case 0x1EAF: // ắ [LATIN SMALL LETTER A WITH BREVE AND ACUTE]
case 0x1EB1: // ằ [LATIN SMALL LETTER A WITH BREVE AND GRAVE]
case 0x1EB3: // ẳ [LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE]
case 0x1EB5: // ẵ [LATIN SMALL LETTER A WITH BREVE AND TILDE]
case 0x1EB7: // ặ [LATIN SMALL LETTER A WITH BREVE AND DOT BELOW]
case 0x2090: // ₐ [LATIN SUBSCRIPT SMALL LETTER A]
case 0x2094: // ₔ [LATIN SUBSCRIPT SMALL LETTER SCHWA]
case 0x24D0: // ⓐ [CIRCLED LATIN SMALL LETTER A]
case 0x2C65: // ⱥ [LATIN SMALL LETTER A WITH STROKE]
case 0x2C6F: // Ɐ [LATIN CAPITAL LETTER TURNED A]
case 0xFF41: // a [FULLWIDTH LATIN SMALL LETTER A]
outString += "a";
break;
case 0xA732: // Ꜳ [LATIN CAPITAL LETTER AA]
outString += "A";
outString += "A";
break;
case 0xC6: // Æ [LATIN CAPITAL LETTER AE]
case 0x1E2: // Ǣ [LATIN CAPITAL LETTER AE WITH MACRON]
case 0x1FC: // Ǽ [LATIN CAPITAL LETTER AE WITH ACUTE]
case 0x1D01: // ᴁ [LATIN LETTER SMALL CAPITAL AE]
outString += "A";
outString += "E";
break;
case 0xA734: // Ꜵ [LATIN CAPITAL LETTER AO]
outString += "A";
outString += "O";
break;
case 0xA736: // Ꜷ [LATIN CAPITAL LETTER AU]
outString += "A";
outString += "U";
break;
case 0xA738: // Ꜹ [LATIN CAPITAL LETTER AV]
case 0xA73A: // Ꜻ [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR]
outString += "A";
outString += "V";
break;
case 0xA73C: // Ꜽ [LATIN CAPITAL LETTER AY]
outString += "A";
outString += "Y";
break;
case 0x249C: // ⒜ [PARENTHESIZED LATIN SMALL LETTER A]
outString += "(";
outString += "a";
outString += ")";
break;
case 0xA733: // ꜳ [LATIN SMALL LETTER AA]
outString += "a";
outString += "a";
break;
case 0xE6: // æ [LATIN SMALL LETTER AE]
case 0x1E3: // ǣ [LATIN SMALL LETTER AE WITH MACRON]
case 0x1FD: // ǽ [LATIN SMALL LETTER AE WITH ACUTE]
case 0x1D02: // ᴂ [LATIN SMALL LETTER TURNED AE]
outString += "a";
outString += "e";
break;
case 0xA735: // ꜵ [LATIN SMALL LETTER AO]
outString += "a";
outString += "o";
break;
case 0xA737: // ꜷ [LATIN SMALL LETTER AU]
outString += "a";
outString += "u";
break;
case 0xA739: // ꜹ [LATIN SMALL LETTER AV]
case 0xA73B: // ꜻ [LATIN SMALL LETTER AV WITH HORIZONTAL BAR]
outString += "a";
outString += "v";
break;
case 0xA73D: // ꜽ [LATIN SMALL LETTER AY]
outString += "a";
outString += "y";
break;
case 0x181: // Ɓ [LATIN CAPITAL LETTER B WITH HOOK]
case 0x182: // Ƃ [LATIN CAPITAL LETTER B WITH TOPBAR]
case 0x243: // Ƀ [LATIN CAPITAL LETTER B WITH STROKE]
case 0x299: // ʙ [LATIN LETTER SMALL CAPITAL B]
case 0x1D03: // ᴃ [LATIN LETTER SMALL CAPITAL BARRED B]
case 0x1E02: // Ḃ [LATIN CAPITAL LETTER B WITH DOT ABOVE]
case 0x1E04: // Ḅ [LATIN CAPITAL LETTER B WITH DOT BELOW]
case 0x1E06: // Ḇ [LATIN CAPITAL LETTER B WITH LINE BELOW]
case 0x24B7: // Ⓑ [CIRCLED LATIN CAPITAL LETTER B]
case 0xFF22: // B [FULLWIDTH LATIN CAPITAL LETTER B]
outString += "B";
break;
case 0x180: // ƀ [LATIN SMALL LETTER B WITH STROKE]
case 0x183: // ƃ [LATIN SMALL LETTER B WITH TOPBAR]
case 0x253: // ɓ [LATIN SMALL LETTER B WITH HOOK]
case 0x1D6C: // ᵬ [LATIN SMALL LETTER B WITH MIDDLE TILDE]
case 0x1D80: // ᶀ [LATIN SMALL LETTER B WITH PALATAL HOOK]
case 0x1E03: // ḃ [LATIN SMALL LETTER B WITH DOT ABOVE]
case 0x1E05: // ḅ [LATIN SMALL LETTER B WITH DOT BELOW]
case 0x1E07: // ḇ [LATIN SMALL LETTER B WITH LINE BELOW]
case 0x24D1: // ⓑ [CIRCLED LATIN SMALL LETTER B]
case 0xFF42: // b [FULLWIDTH LATIN SMALL LETTER B]
outString += "b";
break;
case 0x249D: // ⒝ [PARENTHESIZED LATIN SMALL LETTER B]
outString += "(";
outString += "b";
outString += ")";
break;
case 0xC7: // Ç [LATIN CAPITAL LETTER C WITH CEDILLA]
case 0x106: // Ć [LATIN CAPITAL LETTER C WITH ACUTE]
case 0x108: // Ĉ [LATIN CAPITAL LETTER C WITH CIRCUMFLEX]
case 0x10A: // Ċ [LATIN CAPITAL LETTER C WITH DOT ABOVE]
case 0x10C: // Č [LATIN CAPITAL LETTER C WITH CARON]
case 0x187: // Ƈ [LATIN CAPITAL LETTER C WITH HOOK]
case 0x23B: // Ȼ [LATIN CAPITAL LETTER C WITH STROKE]
case 0x297: // ʗ [LATIN LETTER STRETCHED C]
case 0x1D04: // ᴄ [LATIN LETTER SMALL CAPITAL C]
case 0x1E08: // Ḉ [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE]
case 0x24B8: // Ⓒ [CIRCLED LATIN CAPITAL LETTER C]
case 0xFF23: // C [FULLWIDTH LATIN CAPITAL LETTER C]
outString += "C";
break;
case 0xE7: // ç [LATIN SMALL LETTER C WITH CEDILLA]
case 0x107: // ć [LATIN SMALL LETTER C WITH ACUTE]
case 0x109: // ĉ [LATIN SMALL LETTER C WITH CIRCUMFLEX]
case 0x10B: // ċ [LATIN SMALL LETTER C WITH DOT ABOVE]
case 0x10D: // č [LATIN SMALL LETTER C WITH CARON]
case 0x188: // ƈ [LATIN SMALL LETTER C WITH HOOK]
case 0x23C: // ȼ [LATIN SMALL LETTER C WITH STROKE]
case 0x255: // ɕ [LATIN SMALL LETTER C WITH CURL]
case 0x1E09: // ḉ [LATIN SMALL LETTER C WITH CEDILLA AND ACUTE]
case 0x2184: // ↄ [LATIN SMALL LETTER REVERSED C]
case 0x24D2: // ⓒ [CIRCLED LATIN SMALL LETTER C]
case 0xA73E: // Ꜿ [LATIN CAPITAL LETTER REVERSED C WITH DOT]
case 0xA73F: // ꜿ [LATIN SMALL LETTER REVERSED C WITH DOT]
case 0xFF43: // c [FULLWIDTH LATIN SMALL LETTER C]
outString += "c";
break;
case 0x249E: // ⒞ [PARENTHESIZED LATIN SMALL LETTER C]
outString += "(";
outString += "c";
outString += ")";
break;
case 0xD0: // Ð [LATIN CAPITAL LETTER ETH]
case 0x10E: // Ď [LATIN CAPITAL LETTER D WITH CARON]
case 0x110: // Đ [LATIN CAPITAL LETTER D WITH STROKE]
case 0x189: // Ɖ [LATIN CAPITAL LETTER AFRICAN D]
case 0x18A: // Ɗ [LATIN CAPITAL LETTER D WITH HOOK]
case 0x18B: // Ƌ [LATIN CAPITAL LETTER D WITH TOPBAR]
case 0x1D05: // ᴅ [LATIN LETTER SMALL CAPITAL D]
case 0x1D06: // ᴆ [LATIN LETTER SMALL CAPITAL ETH]
case 0x1E0A: // Ḋ [LATIN CAPITAL LETTER D WITH DOT ABOVE]
case 0x1E0C: // Ḍ [LATIN CAPITAL LETTER D WITH DOT BELOW]
case 0x1E0E: // Ḏ [LATIN CAPITAL LETTER D WITH LINE BELOW]
case 0x1E10: // Ḑ [LATIN CAPITAL LETTER D WITH CEDILLA]
case 0x1E12: // Ḓ [LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW]
case 0x24B9: // Ⓓ [CIRCLED LATIN CAPITAL LETTER D]
case 0xA779: // Ꝺ [LATIN CAPITAL LETTER INSULAR D]
case 0xFF24: // D [FULLWIDTH LATIN CAPITAL LETTER D]
outString += "D";
break;
case 0xF0: // ð [LATIN SMALL LETTER ETH]
case 0x10F: // ď [LATIN SMALL LETTER D WITH CARON]
case 0x111: // đ [LATIN SMALL LETTER D WITH STROKE]
case 0x18C: // ƌ [LATIN SMALL LETTER D WITH TOPBAR]
case 0x221: // ȡ [LATIN SMALL LETTER D WITH CURL]
case 0x256: // ɖ [LATIN SMALL LETTER D WITH TAIL]
case 0x257: // ɗ [LATIN SMALL LETTER D WITH HOOK]
case 0x1D6D: // ᵭ [LATIN SMALL LETTER D WITH MIDDLE TILDE]
case 0x1D81: // ᶁ [LATIN SMALL LETTER D WITH PALATAL HOOK]
case 0x1D91: // ᶑ [LATIN SMALL LETTER D WITH HOOK AND TAIL]
case 0x1E0B: // ḋ [LATIN SMALL LETTER D WITH DOT ABOVE]
case 0x1E0D: // ḍ [LATIN SMALL LETTER D WITH DOT BELOW]
case 0x1E0F: // ḏ [LATIN SMALL LETTER D WITH LINE BELOW]
case 0x1E11: // ḑ [LATIN SMALL LETTER D WITH CEDILLA]
case 0x1E13: // ḓ [LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW]
case 0x24D3: // ⓓ [CIRCLED LATIN SMALL LETTER D]
case 0xA77A: // ꝺ [LATIN SMALL LETTER INSULAR D]
case 0xFF44: // d [FULLWIDTH LATIN SMALL LETTER D]
outString += "d";
break;
case 0x1C4: // DŽ [LATIN CAPITAL LETTER DZ WITH CARON]
case 0x1F1: // DZ [LATIN CAPITAL LETTER DZ]
outString += "D";
outString += "Z";
break;
case 0x1C5: // Dž [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]
case 0x1F2: // Dz [LATIN CAPITAL LETTER D WITH SMALL LETTER Z]
outString += "D";
outString += "z";
break;
case 0x249F: // ⒟ [PARENTHESIZED LATIN SMALL LETTER D]
outString += "(";
outString += "d";
outString += ")";
break;
case 0x238: // ȸ [LATIN SMALL LETTER DB DIGRAPH]
outString += "d";
outString += "b";
break;
case 0x1C6: // dž [LATIN SMALL LETTER DZ WITH CARON]
case 0x1F3: // dz [LATIN SMALL LETTER DZ]
case 0x2A3: // ʣ [LATIN SMALL LETTER DZ DIGRAPH]
case 0x2A5: // ʥ [LATIN SMALL LETTER DZ DIGRAPH WITH CURL]
outString += "d";
outString += "z";
break;
case 0xC8: // È [LATIN CAPITAL LETTER E WITH GRAVE]
case 0xC9: // É [LATIN CAPITAL LETTER E WITH ACUTE]
case 0xCA: // Ê [LATIN CAPITAL LETTER E WITH CIRCUMFLEX]
case 0xCB: // Ë [LATIN CAPITAL LETTER E WITH DIAERESIS]
case 0x112: // Ē [LATIN CAPITAL LETTER E WITH MACRON]
case 0x114: // Ĕ [LATIN CAPITAL LETTER E WITH BREVE]
case 0x116: // Ė [LATIN CAPITAL LETTER E WITH DOT ABOVE]
case 0x118: // Ę [LATIN CAPITAL LETTER E WITH OGONEK]
case 0x11A: // Ě [LATIN CAPITAL LETTER E WITH CARON]
case 0x18E: // Ǝ [LATIN CAPITAL LETTER REVERSED E]
case 0x190: // Ɛ [LATIN CAPITAL LETTER OPEN E]
case 0x204: // Ȅ [LATIN CAPITAL LETTER E WITH DOUBLE GRAVE]
case 0x206: // Ȇ [LATIN CAPITAL LETTER E WITH INVERTED BREVE]
case 0x228: // Ȩ [LATIN CAPITAL LETTER E WITH CEDILLA]
case 0x246: // Ɇ [LATIN CAPITAL LETTER E WITH STROKE]
case 0x1D07: // ᴇ [LATIN LETTER SMALL CAPITAL E]
case 0x1E14: // Ḕ [LATIN CAPITAL LETTER E WITH MACRON AND GRAVE]
case 0x1E16: // Ḗ [LATIN CAPITAL LETTER E WITH MACRON AND ACUTE]
case 0x1E18: // Ḙ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW]
case 0x1E1A: // Ḛ [LATIN CAPITAL LETTER E WITH TILDE BELOW]
case 0x1E1C: // Ḝ [LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE]
case 0x1EB8: // Ẹ [LATIN CAPITAL LETTER E WITH DOT BELOW]
case 0x1EBA: // Ẻ [LATIN CAPITAL LETTER E WITH HOOK ABOVE]
case 0x1EBC: // Ẽ [LATIN CAPITAL LETTER E WITH TILDE]
case 0x1EBE: // Ế [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE]
case 0x1EC0: // Ề [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE]
case 0x1EC2: // Ể [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
case 0x1EC4: // Ễ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE]
case 0x1EC6: // Ệ [LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
case 0x24BA: // Ⓔ [CIRCLED LATIN CAPITAL LETTER E]
case 0x2C7B: // ⱻ [LATIN LETTER SMALL CAPITAL TURNED E]
case 0xFF25: // E [FULLWIDTH LATIN CAPITAL LETTER E]
outString += "E";
break;
case 0xE8: // è [LATIN SMALL LETTER E WITH GRAVE]
case 0xE9: // é [LATIN SMALL LETTER E WITH ACUTE]
case 0xEA: // ê [LATIN SMALL LETTER E WITH CIRCUMFLEX]
case 0xEB: // ë [LATIN SMALL LETTER E WITH DIAERESIS]
case 0x113: // ē [LATIN SMALL LETTER E WITH MACRON]
case 0x115: // ĕ [LATIN SMALL LETTER E WITH BREVE]
case 0x117: // ė [LATIN SMALL LETTER E WITH DOT ABOVE]
case 0x119: // ę [LATIN SMALL LETTER E WITH OGONEK]
case 0x11B: // ě [LATIN SMALL LETTER E WITH CARON]
case 0x1DD: // ǝ [LATIN SMALL LETTER TURNED E]
case 0x205: // ȅ [LATIN SMALL LETTER E WITH DOUBLE GRAVE]
case 0x207: // ȇ [LATIN SMALL LETTER E WITH INVERTED BREVE]
case 0x229: // ȩ [LATIN SMALL LETTER E WITH CEDILLA]
case 0x247: // ɇ [LATIN SMALL LETTER E WITH STROKE]
case 0x258: // ɘ [LATIN SMALL LETTER REVERSED E]
case 0x25B: // ɛ [LATIN SMALL LETTER OPEN E]
case 0x25C: // ɜ [LATIN SMALL LETTER REVERSED OPEN E]
case 0x25D: // ɝ [LATIN SMALL LETTER REVERSED OPEN E WITH HOOK]
case 0x25E: // ɞ [LATIN SMALL LETTER CLOSED REVERSED OPEN E]
case 0x29A: // ʚ [LATIN SMALL LETTER CLOSED OPEN E]
case 0x1D08: // ᴈ [LATIN SMALL LETTER TURNED OPEN E]
case 0x1D92: // ᶒ [LATIN SMALL LETTER E WITH RETROFLEX HOOK]
case 0x1D93: // ᶓ [LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK]
case 0x1D94: // ᶔ [LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK]
case 0x1E15: // ḕ [LATIN SMALL LETTER E WITH MACRON AND GRAVE]
case 0x1E17: // ḗ [LATIN SMALL LETTER E WITH MACRON AND ACUTE]
case 0x1E19: // ḙ [LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW]
case 0x1E1B: // ḛ [LATIN SMALL LETTER E WITH TILDE BELOW]
case 0x1E1D: // ḝ [LATIN SMALL LETTER E WITH CEDILLA AND BREVE]
case 0x1EB9: // ẹ [LATIN SMALL LETTER E WITH DOT BELOW]
case 0x1EBB: // ẻ [LATIN SMALL LETTER E WITH HOOK ABOVE]
case 0x1EBD: // ẽ [LATIN SMALL LETTER E WITH TILDE]
case 0x1EBF: // ế [LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE]
case 0x1EC1: // ề [LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE]
case 0x1EC3: // ể [LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE]
case 0x1EC5: // ễ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE]
case 0x1EC7: // ệ [LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW]
case 0x2091: // ₑ [LATIN SUBSCRIPT SMALL LETTER E]
case 0x24D4: // ⓔ [CIRCLED LATIN SMALL LETTER E]
case 0x2C78: // ⱸ [LATIN SMALL LETTER E WITH NOTCH]
case 0xFF45: // e [FULLWIDTH LATIN SMALL LETTER E]
outString += "e";
break;
case 0x24A0: // ⒠ [PARENTHESIZED LATIN SMALL LETTER E]
outString += "(";
outString += "e";
outString += ")";
break;
case 0x191: // Ƒ [LATIN CAPITAL LETTER F WITH HOOK]
case 0x1E1E: // Ḟ [LATIN CAPITAL LETTER F WITH DOT ABOVE]
case 0x24BB: // Ⓕ [CIRCLED LATIN CAPITAL LETTER F]
case 0xA730: // ꜰ [LATIN LETTER SMALL CAPITAL F]
case 0xA77B: // Ꝼ [LATIN CAPITAL LETTER INSULAR F]
case 0xA7FB: // ꟻ [LATIN EPIGRAPHIC LETTER REVERSED F]
case 0xFF26: // F [FULLWIDTH LATIN CAPITAL LETTER F]
outString += "F";
break;
case 0x192: // ƒ [LATIN SMALL LETTER F WITH HOOK]
case 0x1D6E: // ᵮ [LATIN SMALL LETTER F WITH MIDDLE TILDE]
case 0x1D82: // ᶂ [LATIN SMALL LETTER F WITH PALATAL HOOK]
case 0x1E1F: // ḟ [LATIN SMALL LETTER F WITH DOT ABOVE]
case 0x1E9B: // ẛ [LATIN SMALL LETTER LONG S WITH DOT ABOVE]
case 0x24D5: // ⓕ [CIRCLED LATIN SMALL LETTER F]
case 0xA77C: // ꝼ [LATIN SMALL LETTER INSULAR F]
case 0xFF46: // f [FULLWIDTH LATIN SMALL LETTER F]
outString += "f";
break;
case 0x24A1: // ⒡ [PARENTHESIZED LATIN SMALL LETTER F]
outString += "(";
outString += "f";
outString += ")";
break;
case 0xFB00: // ff [LATIN SMALL LIGATURE FF]
outString += "f";
outString += "f";
break;
case 0xFB03: // ffi [LATIN SMALL LIGATURE FFI]
outString += "f";
outString += "f";
outString += "i";
break;
case 0xFB04: // ffl [LATIN SMALL LIGATURE FFL]
outString += "f";
outString += "f";
outString += "l";
break;
case 0xFB01: // fi [LATIN SMALL LIGATURE FI]
outString += "f";
outString += "i";
break;
case 0xFB02: // fl [LATIN SMALL LIGATURE FL]
outString += "f";
outString += "l";
break;
case 0x11C: // Ĝ [LATIN CAPITAL LETTER G WITH CIRCUMFLEX]
case 0x11E: // Ğ [LATIN CAPITAL LETTER G WITH BREVE]
case 0x120: // Ġ [LATIN CAPITAL LETTER G WITH DOT ABOVE]
case 0x122: // Ģ [LATIN CAPITAL LETTER G WITH CEDILLA]
case 0x193: // Ɠ [LATIN CAPITAL LETTER G WITH HOOK]
case 0x1E4: // Ǥ [LATIN CAPITAL LETTER G WITH STROKE]
case 0x1E5: // ǥ [LATIN SMALL LETTER G WITH STROKE]
case 0x1E6: // Ǧ [LATIN CAPITAL LETTER G WITH CARON]
case 0x1E7: // ǧ [LATIN SMALL LETTER G WITH CARON]
case 0x1F4: // Ǵ [LATIN CAPITAL LETTER G WITH ACUTE]
case 0x262: // ɢ [LATIN LETTER SMALL CAPITAL G]
case 0x29B: // ʛ [LATIN LETTER SMALL CAPITAL G WITH HOOK]
case 0x1E20: // Ḡ [LATIN CAPITAL LETTER G WITH MACRON]
case 0x24BC: // Ⓖ [CIRCLED LATIN CAPITAL LETTER G]
case 0xA77D: // Ᵹ [LATIN CAPITAL LETTER INSULAR G]
case 0xA77E: // Ꝿ [LATIN CAPITAL LETTER TURNED INSULAR G]
case 0xFF27: // G [FULLWIDTH LATIN CAPITAL LETTER G]
outString += "G";
break;
case 0x11D: // ĝ [LATIN SMALL LETTER G WITH CIRCUMFLEX]
case 0x11F: // ğ [LATIN SMALL LETTER G WITH BREVE]
case 0x121: // ġ [LATIN SMALL LETTER G WITH DOT ABOVE]
case 0x123: // ģ [LATIN SMALL LETTER G WITH CEDILLA]
case 0x1F5: // ǵ [LATIN SMALL LETTER G WITH ACUTE]
case 0x260: // ɠ [LATIN SMALL LETTER G WITH HOOK]
case 0x261: // ɡ [LATIN SMALL LETTER SCRIPT G]
case 0x1D77: // ᵷ [LATIN SMALL LETTER TURNED G]
case 0x1D79: // ᵹ [LATIN SMALL LETTER INSULAR G]
case 0x1D83: // ᶃ [LATIN SMALL LETTER G WITH PALATAL HOOK]
case 0x1E21: // ḡ [LATIN SMALL LETTER G WITH MACRON]
case 0x24D6: // ⓖ [CIRCLED LATIN SMALL LETTER G]
case 0xA77F: // ꝿ [LATIN SMALL LETTER TURNED INSULAR G]
case 0xFF47: // g [FULLWIDTH LATIN SMALL LETTER G]
outString += "g";
break;
case 0x24A2: // ⒢ [PARENTHESIZED LATIN SMALL LETTER G]
outString += "(";
outString += "g";
outString += ")";
break;
case 0x124: // Ĥ [LATIN CAPITAL LETTER H WITH CIRCUMFLEX]
case 0x126: // Ħ [LATIN CAPITAL LETTER H WITH STROKE]
case 0x21E: // Ȟ [LATIN CAPITAL LETTER H WITH CARON]
case 0x29C: // ʜ [LATIN LETTER SMALL CAPITAL H]
case 0x1E22: // Ḣ [LATIN CAPITAL LETTER H WITH DOT ABOVE]
case 0x1E24: // Ḥ [LATIN CAPITAL LETTER H WITH DOT BELOW]
case 0x1E26: // Ḧ [LATIN CAPITAL LETTER H WITH DIAERESIS]
case 0x1E28: // Ḩ [LATIN CAPITAL LETTER H WITH CEDILLA]
case 0x1E2A: // Ḫ [LATIN CAPITAL LETTER H WITH BREVE BELOW]
case 0x24BD: // Ⓗ [CIRCLED LATIN CAPITAL LETTER H]
case 0x2C67: // Ⱨ [LATIN CAPITAL LETTER H WITH DESCENDER]
case 0x2C75: // Ⱶ [LATIN CAPITAL LETTER HALF H]
case 0xFF28: // H [FULLWIDTH LATIN CAPITAL LETTER H]
outString += "H";
break;
case 0x125: // ĥ [LATIN SMALL LETTER H WITH CIRCUMFLEX]
case 0x127: // ħ [LATIN SMALL LETTER H WITH STROKE]
case 0x21F: // ȟ [LATIN SMALL LETTER H WITH CARON]
case 0x265: // ɥ [LATIN SMALL LETTER TURNED H]
case 0x266: // ɦ [LATIN SMALL LETTER H WITH HOOK]
case 0x2AE: // ʮ [LATIN SMALL LETTER TURNED H WITH FISHHOOK]
case 0x2AF: // ʯ [LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL]
case 0x1E23: // ḣ [LATIN SMALL LETTER H WITH DOT ABOVE]
case 0x1E25: // ḥ [LATIN SMALL LETTER H WITH DOT BELOW]
case 0x1E27: // ḧ [LATIN SMALL LETTER H WITH DIAERESIS]
case 0x1E29: // ḩ [LATIN SMALL LETTER H WITH CEDILLA]
case 0x1E2B: // ḫ [LATIN SMALL LETTER H WITH BREVE BELOW]
case 0x1E96: // ẖ [LATIN SMALL LETTER H WITH LINE BELOW]
case 0x24D7: // ⓗ [CIRCLED LATIN SMALL LETTER H]
case 0x2C68: // ⱨ [LATIN SMALL LETTER H WITH DESCENDER]
case 0x2C76: // ⱶ [LATIN SMALL LETTER HALF H]
case 0xFF48: // h [FULLWIDTH LATIN SMALL LETTER H]
outString += "h";
break;
case 0x1F6: // Ƕ http;//en.wikipedia.org/wiki/Hwair [LATIN CAPITAL LETTER HWAIR]
outString += "H";
outString += "V";
break;
case 0x24A3: // ⒣ [PARENTHESIZED LATIN SMALL LETTER H]
outString += "(";
outString += "h";
outString += ")";
break;
case 0x195: // ƕ [LATIN SMALL LETTER HV]
outString += "h";
outString += "v";
break;
case 0xCC: // Ì [LATIN CAPITAL LETTER I WITH GRAVE]
case 0xCD: // Í [LATIN CAPITAL LETTER I WITH ACUTE]
case 0xCE: // Î [LATIN CAPITAL LETTER I WITH CIRCUMFLEX]
case 0xCF: // Ï [LATIN CAPITAL LETTER I WITH DIAERESIS]
case 0x128: // Ĩ [LATIN CAPITAL LETTER I WITH TILDE]
case 0x12A: // Ī [LATIN CAPITAL LETTER I WITH MACRON]
case 0x12C: // Ĭ [LATIN CAPITAL LETTER I WITH BREVE]
case 0x12E: // Į [LATIN CAPITAL LETTER I WITH OGONEK]
case 0x130: // İ [LATIN CAPITAL LETTER I WITH DOT ABOVE]
case 0x196: // Ɩ [LATIN CAPITAL LETTER IOTA]
case 0x197: // Ɨ [LATIN CAPITAL LETTER I WITH STROKE]
case 0x1CF: // Ǐ [LATIN CAPITAL LETTER I WITH CARON]
case 0x208: // Ȉ [LATIN CAPITAL LETTER I WITH DOUBLE GRAVE]
case 0x20A: // Ȋ [LATIN CAPITAL LETTER I WITH INVERTED BREVE]
case 0x26A: // ɪ [LATIN LETTER SMALL CAPITAL I]
case 0x1D7B: // ᵻ [LATIN SMALL CAPITAL LETTER I WITH STROKE]
case 0x1E2C: // Ḭ [LATIN CAPITAL LETTER I WITH TILDE BELOW]
case 0x1E2E: // Ḯ [LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE]
case 0x1EC8: // Ỉ [LATIN CAPITAL LETTER I WITH HOOK ABOVE]
case 0x1ECA: // Ị [LATIN CAPITAL LETTER I WITH DOT BELOW]
case 0x24BE: // Ⓘ [CIRCLED LATIN CAPITAL LETTER I]
case 0xA7FE: // ꟾ [LATIN EPIGRAPHIC LETTER I LONGA]
case 0xFF29: // I [FULLWIDTH LATIN CAPITAL LETTER I]
outString += "I";
break;
case 0xEC: // ì [LATIN SMALL LETTER I WITH GRAVE]
case 0xED: // í [LATIN SMALL LETTER I WITH ACUTE]
case 0xEE: // î [LATIN SMALL LETTER I WITH CIRCUMFLEX]
case 0xEF: // ï [LATIN SMALL LETTER I WITH DIAERESIS]
case 0x129: // ĩ [LATIN SMALL LETTER I WITH TILDE]
case 0x12B: // ī [LATIN SMALL LETTER I WITH MACRON]
case 0x12D: // ĭ [LATIN SMALL LETTER I WITH BREVE]
case 0x12F: // į [LATIN SMALL LETTER I WITH OGONEK]
case 0x131: // ı [LATIN SMALL LETTER DOTLESS I]
case 0x1D0: // ǐ [LATIN SMALL LETTER I WITH CARON]
case 0x209: // ȉ [LATIN SMALL LETTER I WITH DOUBLE GRAVE]
case 0x20B: // ȋ [LATIN SMALL LETTER I WITH INVERTED BREVE]
case 0x268: // ɨ [LATIN SMALL LETTER I WITH STROKE]
case 0x1D09: // ᴉ [LATIN SMALL LETTER TURNED I]
case 0x1D62: // ᵢ [LATIN SUBSCRIPT SMALL LETTER I]
case 0x1D7C: // ᵼ [LATIN SMALL LETTER IOTA WITH STROKE]
case 0x1D96: // ᶖ [LATIN SMALL LETTER I WITH RETROFLEX HOOK]
case 0x1E2D: // ḭ [LATIN SMALL LETTER I WITH TILDE BELOW]
case 0x1E2F: // ḯ [LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE]
case 0x1EC9: // ỉ [LATIN SMALL LETTER I WITH HOOK ABOVE]
case 0x1ECB: // ị [LATIN SMALL LETTER I WITH DOT BELOW]
case 0x2071: // ⁱ [SUPERSCRIPT LATIN SMALL LETTER I]
case 0x24D8: // ⓘ [CIRCLED LATIN SMALL LETTER I]
case 0xFF49: // i [FULLWIDTH LATIN SMALL LETTER I]
outString += "i";
break;
case 0x132: // IJ [LATIN CAPITAL LIGATURE IJ]
outString += "I";
outString += "J";
break;
case 0x24A4: // ⒤ [PARENTHESIZED LATIN SMALL LETTER I]
outString += "(";
outString += "i";
outString += ")";
break;
case 0x133: // ij [LATIN SMALL LIGATURE IJ]
outString += "i";
outString += "j";
break;
case 0x134: // Ĵ [LATIN CAPITAL LETTER J WITH CIRCUMFLEX]
case 0x248: // Ɉ [LATIN CAPITAL LETTER J WITH STROKE]
case 0x1D0A: // ᴊ [LATIN LETTER SMALL CAPITAL J]
case 0x24BF: // Ⓙ [CIRCLED LATIN CAPITAL LETTER J]
case 0xFF2A: // J [FULLWIDTH LATIN CAPITAL LETTER J]
outString += "J";
break;
case 0x135: // ĵ [LATIN SMALL LETTER J WITH CIRCUMFLEX]
case 0x1F0: // ǰ [LATIN SMALL LETTER J WITH CARON]
case 0x237: // ȷ [LATIN SMALL LETTER DOTLESS J]
case 0x249: // ɉ [LATIN SMALL LETTER J WITH STROKE]
case 0x25F: // ɟ [LATIN SMALL LETTER DOTLESS J WITH STROKE]
case 0x284: // ʄ [LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK]
case 0x29D: // ʝ [LATIN SMALL LETTER J WITH CROSSED-TAIL]
case 0x24D9: // ⓙ [CIRCLED LATIN SMALL LETTER J]
case 0x2C7C: // ⱼ [LATIN SUBSCRIPT SMALL LETTER J]
case 0xFF4A: // j [FULLWIDTH LATIN SMALL LETTER J]
outString += "j";
break;
case 0x24A5: // ⒥ [PARENTHESIZED LATIN SMALL LETTER J]
outString += "(";
outString += "j";
outString += ")";
break;
case 0x136: // Ķ [LATIN CAPITAL LETTER K WITH CEDILLA]
case 0x198: // Ƙ [LATIN CAPITAL LETTER K WITH HOOK]
case 0x1E8: // Ǩ [LATIN CAPITAL LETTER K WITH CARON]
case 0x1D0B: // ᴋ [LATIN LETTER SMALL CAPITAL K]
case 0x1E30: // Ḱ [LATIN CAPITAL LETTER K WITH ACUTE]
case 0x1E32: // Ḳ [LATIN CAPITAL LETTER K WITH DOT BELOW]
case 0x1E34: // Ḵ [LATIN CAPITAL LETTER K WITH LINE BELOW]
case 0x24C0: // Ⓚ [CIRCLED LATIN CAPITAL LETTER K]
case 0x2C69: // Ⱪ [LATIN CAPITAL LETTER K WITH DESCENDER]
case 0xA740: // Ꝁ [LATIN CAPITAL LETTER K WITH STROKE]
case 0xA742: // Ꝃ [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE]
case 0xA744: // Ꝅ [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE]
case 0xFF2B: // K [FULLWIDTH LATIN CAPITAL LETTER K]
outString += "K";
break;
case 0x137: // ķ [LATIN SMALL LETTER K WITH CEDILLA]
case 0x199: // ƙ [LATIN SMALL LETTER K WITH HOOK]
case 0x1E9: // ǩ [LATIN SMALL LETTER K WITH CARON]
case 0x29E: // ʞ [LATIN SMALL LETTER TURNED K]
case 0x1D84: // ᶄ [LATIN SMALL LETTER K WITH PALATAL HOOK]
case 0x1E31: // ḱ [LATIN SMALL LETTER K WITH ACUTE]
case 0x1E33: // ḳ [LATIN SMALL LETTER K WITH DOT BELOW]
case 0x1E35: // ḵ [LATIN SMALL LETTER K WITH LINE BELOW]
case 0x24DA: // ⓚ [CIRCLED LATIN SMALL LETTER K]
case 0x2C6A: // ⱪ [LATIN SMALL LETTER K WITH DESCENDER]
case 0xA741: // ꝁ [LATIN SMALL LETTER K WITH STROKE]
case 0xA743: // ꝃ [LATIN SMALL LETTER K WITH DIAGONAL STROKE]
case 0xA745: // ꝅ [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE]
case 0xFF4B: // k [FULLWIDTH LATIN SMALL LETTER K]
outString += "k";
break;
case 0x24A6: // ⒦ [PARENTHESIZED LATIN SMALL LETTER K]
outString += "(";
outString += "k";
outString += ")";
break;
case 0x139: // Ĺ [LATIN CAPITAL LETTER L WITH ACUTE]
case 0x13B: // Ļ [LATIN CAPITAL LETTER L WITH CEDILLA]
case 0x13D: // Ľ [LATIN CAPITAL LETTER L WITH CARON]
case 0x13F: // Ŀ [LATIN CAPITAL LETTER L WITH MIDDLE DOT]
case 0x141: // Ł [LATIN CAPITAL LETTER L WITH STROKE]
case 0x23D: // Ƚ [LATIN CAPITAL LETTER L WITH BAR]
case 0x29F: // ʟ [LATIN LETTER SMALL CAPITAL L]
case 0x1D0C: // ᴌ [LATIN LETTER SMALL CAPITAL L WITH STROKE]
case 0x1E36: // Ḷ [LATIN CAPITAL LETTER L WITH DOT BELOW]
case 0x1E38: // Ḹ [LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON]
case 0x1E3A: // Ḻ [LATIN CAPITAL LETTER L WITH LINE BELOW]
case 0x1E3C: // Ḽ [LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW]
case 0x24C1: // Ⓛ [CIRCLED LATIN CAPITAL LETTER L]
case 0x2C60: // Ⱡ [LATIN CAPITAL LETTER L WITH DOUBLE BAR]
case 0x2C62: // Ɫ [LATIN CAPITAL LETTER L WITH MIDDLE TILDE]
case 0xA746: // Ꝇ [LATIN CAPITAL LETTER BROKEN L]
case 0xA748: // Ꝉ [LATIN CAPITAL LETTER L WITH HIGH STROKE]
case 0xA780: // Ꞁ [LATIN CAPITAL LETTER TURNED L]
case 0xFF2C: // L [FULLWIDTH LATIN CAPITAL LETTER L]
outString += "L";
break;
case 0x13A: // ĺ [LATIN SMALL LETTER L WITH ACUTE]
case 0x13C: // ļ [LATIN SMALL LETTER L WITH CEDILLA]
case 0x13E: // ľ [LATIN SMALL LETTER L WITH CARON]
case 0x140: // ŀ [LATIN SMALL LETTER L WITH MIDDLE DOT]
case 0x142: // ł [LATIN SMALL LETTER L WITH STROKE]
case 0x19A: // ƚ [LATIN SMALL LETTER L WITH BAR]
case 0x234: // ȴ [LATIN SMALL LETTER L WITH CURL]
case 0x26B: // ɫ [LATIN SMALL LETTER L WITH MIDDLE TILDE]
case 0x26C: // ɬ [LATIN SMALL LETTER L WITH BELT]
case 0x26D: // ɭ [LATIN SMALL LETTER L WITH RETROFLEX HOOK]
case 0x1D85: // ᶅ [LATIN SMALL LETTER L WITH PALATAL HOOK]
case 0x1E37: // ḷ [LATIN SMALL LETTER L WITH DOT BELOW]
case 0x1E39: // ḹ [LATIN SMALL LETTER L WITH DOT BELOW AND MACRON]
case 0x1E3B: // ḻ [LATIN SMALL LETTER L WITH LINE BELOW]
case 0x1E3D: // ḽ [LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW]
case 0x24DB: // ⓛ [CIRCLED LATIN SMALL LETTER L]
case 0x2C61: // ⱡ [LATIN SMALL LETTER L WITH DOUBLE BAR]
case 0xA747: // ꝇ [LATIN SMALL LETTER BROKEN L]
case 0xA749: // ꝉ [LATIN SMALL LETTER L WITH HIGH STROKE]
case 0xA781: // ꞁ [LATIN SMALL LETTER TURNED L]
case 0xFF4C: // l [FULLWIDTH LATIN SMALL LETTER L]
outString += "l";
break;
case 0x1C7: // LJ [LATIN CAPITAL LETTER LJ]
outString += "L";
outString += "J";
break;
case 0x1EFA: // Ỻ [LATIN CAPITAL LETTER MIDDLE-WELSH LL]
outString += "L";
outString += "L";
break;
case 0x1C8: // Lj [LATIN CAPITAL LETTER L WITH SMALL LETTER J]
outString += "L";
outString += "j";
break;
case 0x24A7: // ⒧ [PARENTHESIZED LATIN SMALL LETTER L]
outString += "(";
outString += "l";
outString += ")";
break;
case 0x1C9: // lj [LATIN SMALL LETTER LJ]
outString += "l";
outString += "j";
break;
case 0x1EFB: // ỻ [LATIN SMALL LETTER MIDDLE-WELSH LL]
outString += "l";
outString += "l";
break;
case 0x2AA: // ʪ [LATIN SMALL LETTER LS DIGRAPH]
outString += "l";
outString += "s";
break;
case 0x2AB: // ʫ [LATIN SMALL LETTER LZ DIGRAPH]
outString += "l";
outString += "z";
break;
case 0x19C: // Ɯ [LATIN CAPITAL LETTER TURNED M]
case 0x1D0D: // ᴍ [LATIN LETTER SMALL CAPITAL M]
case 0x1E3E: // Ḿ [LATIN CAPITAL LETTER M WITH ACUTE]
case 0x1E40: // Ṁ [LATIN CAPITAL LETTER M WITH DOT ABOVE]
case 0x1E42: // Ṃ [LATIN CAPITAL LETTER M WITH DOT BELOW]
case 0x24C2: // Ⓜ [CIRCLED LATIN CAPITAL LETTER M]
case 0x2C6E: // Ɱ [LATIN CAPITAL LETTER M WITH HOOK]
case 0xA7FD: // ꟽ [LATIN EPIGRAPHIC LETTER INVERTED M]
case 0xA7FF: // ꟿ [LATIN EPIGRAPHIC LETTER ARCHAIC M]
case 0xFF2D: // M [FULLWIDTH LATIN CAPITAL LETTER M]
outString += "M";
break;
case 0x26F: // ɯ [LATIN SMALL LETTER TURNED M]
case 0x270: // ɰ [LATIN SMALL LETTER TURNED M WITH LONG LEG]
case 0x271: // ɱ [LATIN SMALL LETTER M WITH HOOK]
case 0x1D6F: // ᵯ [LATIN SMALL LETTER M WITH MIDDLE TILDE]
case 0x1D86: // ᶆ [LATIN SMALL LETTER M WITH PALATAL HOOK]
case 0x1E3F: // ḿ [LATIN SMALL LETTER M WITH ACUTE]
case 0x1E41: // ṁ [LATIN SMALL LETTER M WITH DOT ABOVE]
case 0x1E43: // ṃ [LATIN SMALL LETTER M WITH DOT BELOW]
case 0x24DC: // ⓜ [CIRCLED LATIN SMALL LETTER M]
case 0xFF4D: // m [FULLWIDTH LATIN SMALL LETTER M]
outString += "m";
break;
case 0x24A8: // ⒨ [PARENTHESIZED LATIN SMALL LETTER M]
outString += "(";
outString += "m";
outString += ")";
break;
case 0xD1: // Ñ [LATIN CAPITAL LETTER N WITH TILDE]
case 0x143: // Ń [LATIN CAPITAL LETTER N WITH ACUTE]
case 0x145: // Ņ [LATIN CAPITAL LETTER N WITH CEDILLA]
case 0x147: // Ň [LATIN CAPITAL LETTER N WITH CARON]
case 0x14A: // Ŋ http;//en.wikipedia.org/wiki/Eng_(letter) [LATIN CAPITAL LETTER ENG]
case 0x19D: // Ɲ [LATIN CAPITAL LETTER N WITH LEFT HOOK]
case 0x1F8: // Ǹ [LATIN CAPITAL LETTER N WITH GRAVE]
case 0x220: // Ƞ [LATIN CAPITAL LETTER N WITH LONG RIGHT LEG]
case 0x274: // ɴ [LATIN LETTER SMALL CAPITAL N]
case 0x1D0E: // ᴎ [LATIN LETTER SMALL CAPITAL REVERSED N]
case 0x1E44: // Ṅ [LATIN CAPITAL LETTER N WITH DOT ABOVE]
case 0x1E46: // Ṇ [LATIN CAPITAL LETTER N WITH DOT BELOW]
case 0x1E48: // Ṉ [LATIN CAPITAL LETTER N WITH LINE BELOW]
case 0x1E4A: // Ṋ [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW]
case 0x24C3: // Ⓝ [CIRCLED LATIN CAPITAL LETTER N]
case 0xFF2E: // N [FULLWIDTH LATIN CAPITAL LETTER N]
outString += "N";
break;
case 0xF1: // ñ [LATIN SMALL LETTER N WITH TILDE]
case 0x144: // ń [LATIN SMALL LETTER N WITH ACUTE]
case 0x146: // ņ [LATIN SMALL LETTER N WITH CEDILLA]
case 0x148: // ň [LATIN SMALL LETTER N WITH CARON]
case 0x149: // ʼn [LATIN SMALL LETTER N PRECEDED BY APOSTROPHE]
case 0x14B: // ŋ http;//en.wikipedia.org/wiki/Eng_(letter) [LATIN SMALL LETTER ENG]
case 0x19E: // ƞ [LATIN SMALL LETTER N WITH LONG RIGHT LEG]
case 0x1F9: // ǹ [LATIN SMALL LETTER N WITH GRAVE]
case 0x235: // ȵ [LATIN SMALL LETTER N WITH CURL]
case 0x272: // ɲ [LATIN SMALL LETTER N WITH LEFT HOOK]
case 0x273: // ɳ [LATIN SMALL LETTER N WITH RETROFLEX HOOK]
case 0x1D70: // ᵰ [LATIN SMALL LETTER N WITH MIDDLE TILDE]
case 0x1D87: // ᶇ [LATIN SMALL LETTER N WITH PALATAL HOOK]
case 0x1E45: // ṅ [LATIN SMALL LETTER N WITH DOT ABOVE]
case 0x1E47: // ṇ [LATIN SMALL LETTER N WITH DOT BELOW]
case 0x1E49: // ṉ [LATIN SMALL LETTER N WITH LINE BELOW]
case 0x1E4B: // ṋ [LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW]
case 0x207F: // ⁿ [SUPERSCRIPT LATIN SMALL LETTER N]
case 0x24DD: // ⓝ [CIRCLED LATIN SMALL LETTER N]
case 0xFF4E: // n [FULLWIDTH LATIN SMALL LETTER N]
outString += "n";
break;
case 0x1CA: // NJ [LATIN CAPITAL LETTER NJ]
outString += "N";
outString += "J";
break;
case 0x1CB: // Nj [LATIN CAPITAL LETTER N WITH SMALL LETTER J]
outString += "N";
outString += "j";
break;
case 0x24A9: // ⒩ [PARENTHESIZED LATIN SMALL LETTER N]
outString += "(";
outString += "n";
outString += ")";
break;
case 0x1CC: // nj [LATIN SMALL LETTER NJ]
outString += "n";
outString += "j";
break;
case 0xD2: // Ò [LATIN CAPITAL LETTER O WITH GRAVE]
case 0xD3: // Ó [LATIN CAPITAL LETTER O WITH ACUTE]
case 0xD4: // Ô [LATIN CAPITAL LETTER O WITH CIRCUMFLEX]
case 0xD5: // Õ [LATIN CAPITAL LETTER O WITH TILDE]
case 0xD6: // Ö [LATIN CAPITAL LETTER O WITH DIAERESIS]
case 0xD8: // Ø [LATIN CAPITAL LETTER O WITH STROKE]
case 0x14C: // Ō [LATIN CAPITAL LETTER O WITH MACRON]
case 0x14E: // Ŏ [LATIN CAPITAL LETTER O WITH BREVE]
case 0x150: // Ő [LATIN CAPITAL LETTER O WITH DOUBLE ACUTE]
case 0x186: // Ɔ [LATIN CAPITAL LETTER OPEN O]
case 0x19F: // Ɵ [LATIN CAPITAL LETTER O WITH MIDDLE TILDE]
case 0x1A0: // Ơ [LATIN CAPITAL LETTER O WITH HORN]
case 0x1D1: // Ǒ [LATIN CAPITAL LETTER O WITH CARON]
case 0x1EA: // Ǫ [LATIN CAPITAL LETTER O WITH OGONEK]
case 0x1EC: // Ǭ [LATIN CAPITAL LETTER O WITH OGONEK AND MACRON]
case 0x1FE: // Ǿ [LATIN CAPITAL LETTER O WITH STROKE AND ACUTE]
case 0x20C: // Ȍ [LATIN CAPITAL LETTER O WITH DOUBLE GRAVE]
case 0x20E: // Ȏ [LATIN CAPITAL LETTER O WITH INVERTED BREVE]
case 0x22A: // Ȫ [LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON]
case 0x22C: // Ȭ [LATIN CAPITAL LETTER O WITH TILDE AND MACRON]
case 0x22E: // Ȯ [LATIN CAPITAL LETTER O WITH DOT ABOVE]
case 0x230: // Ȱ [LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON]
case 0x1D0F: // ᴏ [LATIN LETTER SMALL CAPITAL O]
case 0x1D10: // ᴐ [LATIN LETTER SMALL CAPITAL OPEN O]
case 0x1E4C: // Ṍ [LATIN CAPITAL LETTER O WITH TILDE AND ACUTE]
case 0x1E4E: // Ṏ [LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS]
case 0x1E50: // Ṑ [LATIN CAPITAL LETTER O WITH MACRON AND GRAVE]
case 0x1E52: // Ṓ [LATIN CAPITAL LETTER O WITH MACRON AND ACUTE]
case 0x1ECC: // Ọ [LATIN CAPITAL LETTER O WITH DOT BELOW]
case 0x1ECE: // Ỏ [LATIN CAPITAL LETTER O WITH HOOK ABOVE]
case 0x1ED0: // Ố [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE]
case 0x1ED2: // Ồ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE]
case 0x1ED4: // Ổ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
case 0x1ED6: // Ỗ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE]
case 0x1ED8: // Ộ [LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
case 0x1EDA: // Ớ [LATIN CAPITAL LETTER O WITH HORN AND ACUTE]
case 0x1EDC: // Ờ [LATIN CAPITAL LETTER O WITH HORN AND GRAVE]
case 0x1EDE: // Ở [LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE]
case 0x1EE0: // Ỡ [LATIN CAPITAL LETTER O WITH HORN AND TILDE]
case 0x1EE2: // Ợ [LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW]
case 0x24C4: // Ⓞ [CIRCLED LATIN CAPITAL LETTER O]
case 0xA74A: // Ꝋ [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY]
case 0xA74C: // Ꝍ [LATIN CAPITAL LETTER O WITH LOOP]
case 0xFF2F: // O [FULLWIDTH LATIN CAPITAL LETTER O]
outString += "O";
break;
case 0xF2: // ò [LATIN SMALL LETTER O WITH GRAVE]
case 0xF3: // ó [LATIN SMALL LETTER O WITH ACUTE]
case 0xF4: // ô [LATIN SMALL LETTER O WITH CIRCUMFLEX]
case 0xF5: // õ [LATIN SMALL LETTER O WITH TILDE]
case 0xF6: // ö [LATIN SMALL LETTER O WITH DIAERESIS]
case 0xF8: // ø [LATIN SMALL LETTER O WITH STROKE]
case 0x14D: // ō [LATIN SMALL LETTER O WITH MACRON]
case 0x14F: // ŏ [LATIN SMALL LETTER O WITH BREVE]
case 0x151: // ő [LATIN SMALL LETTER O WITH DOUBLE ACUTE]
case 0x1A1: // ơ [LATIN SMALL LETTER O WITH HORN]
case 0x1D2: // ǒ [LATIN SMALL LETTER O WITH CARON]
case 0x1EB: // ǫ [LATIN SMALL LETTER O WITH OGONEK]
case 0x1ED: // ǭ [LATIN SMALL LETTER O WITH OGONEK AND MACRON]
case 0x1FF: // ǿ [LATIN SMALL LETTER O WITH STROKE AND ACUTE]
case 0x20D: // ȍ [LATIN SMALL LETTER O WITH DOUBLE GRAVE]
case 0x20F: // ȏ [LATIN SMALL LETTER O WITH INVERTED BREVE]
case 0x22B: // ȫ [LATIN SMALL LETTER O WITH DIAERESIS AND MACRON]
case 0x22D: // ȭ [LATIN SMALL LETTER O WITH TILDE AND MACRON]
case 0x22F: // ȯ [LATIN SMALL LETTER O WITH DOT ABOVE]
case 0x231: // ȱ [LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON]
case 0x254: // ɔ [LATIN SMALL LETTER OPEN O]
case 0x275: // ɵ [LATIN SMALL LETTER BARRED O]
case 0x1D16: // ᴖ [LATIN SMALL LETTER TOP HALF O]
case 0x1D17: // ᴗ [LATIN SMALL LETTER BOTTOM HALF O]
case 0x1D97: // ᶗ [LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK]
case 0x1E4D: // ṍ [LATIN SMALL LETTER O WITH TILDE AND ACUTE]
case 0x1E4F: // ṏ [LATIN SMALL LETTER O WITH TILDE AND DIAERESIS]
case 0x1E51: // ṑ [LATIN SMALL LETTER O WITH MACRON AND GRAVE]
case 0x1E53: // ṓ [LATIN SMALL LETTER O WITH MACRON AND ACUTE]
case 0x1ECD: // ọ [LATIN SMALL LETTER O WITH DOT BELOW]
case 0x1ECF: // ỏ [LATIN SMALL LETTER O WITH HOOK ABOVE]
case 0x1ED1: // ố [LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE]
case 0x1ED3: // ồ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE]
case 0x1ED5: // ổ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE]
case 0x1ED7: // ỗ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE]
case 0x1ED9: // ộ [LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW]
case 0x1EDB: // ớ [LATIN SMALL LETTER O WITH HORN AND ACUTE]
case 0x1EDD: // ờ [LATIN SMALL LETTER O WITH HORN AND GRAVE]
case 0x1EDF: // ở [LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE]
case 0x1EE1: // ỡ [LATIN SMALL LETTER O WITH HORN AND TILDE]