Warning, file /office/tellico/src/utils/iso5426converter.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /***************************************************************************
0002     Copyright (C) 2006-2009 Robby Stephenson <robby@periapsis.org>
0003  ***************************************************************************/
0004 
0005 /***************************************************************************
0006  *                                                                         *
0007  *   This program is free software; you can redistribute it and/or         *
0008  *   modify it under the terms of the GNU General Public License as        *
0009  *   published by the Free Software Foundation; either version 2 of        *
0010  *   the License or (at your option) version 3 or any later version        *
0011  *   accepted by the membership of KDE e.V. (or its successor approved     *
0012  *   by the membership of KDE e.V.), which shall act as a proxy            *
0013  *   defined in Section 14 of version 3 of the license.                    *
0014  *                                                                         *
0015  *   This program is distributed in the hope that it will be useful,       *
0016  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
0017  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
0018  *   GNU General Public License for more details.                          *
0019  *                                                                         *
0020  *   You should have received a copy of the GNU General Public License     *
0021  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
0022  *                                                                         *
0023  ***************************************************************************/
0024 
0025 // This class is adapted from Iso5426ToUnicode from the MARC4J project, available
0026 // from https://github.com/marc4j/marc4j, with the following notice:
0027 // * Copyright (C) 2002 Bas  Peters  (mail@bpeters.com)
0028 // * Copyright (C) 2002 Yves Pratter (ypratter@club-internet.fr)
0029 //
0030 // That source was released under the terms of the GNU Lesser General Public
0031 // License, version 2.1. In accordance with Condition 3 of that license,
0032 // I am applying the terms of the GNU General Public License to the source
0033 // code, and including a large portion of it here
0034 
0035 #include "iso5426converter.h"
0036 #include "../tellico_debug.h"
0037 
0038 #include <QString>
0039 #include <QByteArray>
0040 
0041 using Tellico::Iso5426Converter;
0042 
0043 QString Iso5426Converter::toUtf8(const QByteArray& text_) {
0044   const uint len = text_.length();
0045   QString result;
0046   result.reserve(len);
0047   for(uint i = 0; i < len; ++i) {
0048     uchar c = uchar(text_.at(i));
0049     if(isAscii(c)) {
0050       result.append(QLatin1Char(c));
0051     } else if(isCombining(c) && hasNext(i, len)) {
0052       // this is a hack
0053       // use the diaeresis instead of umlaut
0054       // works for SUDOC
0055       if(c == 0xC9) {
0056         c = 0xC8;
0057       }
0058       // could be two combining characters
0059       uint comb = c << 8;
0060       uint skip = 1;
0061       const uchar next = uchar(text_.at(i+1));
0062       if(isCombining(next) && hasNext(i+1, len)) {
0063         comb = (comb + next) << 8;
0064         skip++;
0065       }
0066       comb += uchar(text_.at(i+skip));
0067       QChar d = getCombiningChar(comb);
0068       if(!d.isNull()) {
0069         result.append(d);
0070         i += skip;
0071       } else {
0072         result.append(getChar(c));
0073       }
0074     } else {
0075       result.append(getChar(c));
0076     }
0077   }
0078   result.squeeze();
0079   return result;
0080 }
0081 
0082 inline
0083 bool Iso5426Converter::hasNext(uint pos, uint len) {
0084   return pos < (len - 1);
0085 }
0086 
0087 inline
0088 bool Iso5426Converter::isAscii(uchar c) {
0089   return c <= 0x7F;
0090 }
0091 
0092 inline
0093 bool Iso5426Converter::isCombining(uchar c) {
0094   return c >= 0xC0 && c <= 0xDF;
0095 }
0096 
0097 // Source : https://www.itscj.ipsj.or.jp/iso-ir/053.pdf
0098 QChar Iso5426Converter::getChar(uchar c) {
0099   switch(c) {
0100   case 0xA1:
0101     return 0x00A1; // 2/1 inverted exclamation mark
0102   case 0xA2:
0103     return 0x201E; // 2/2 left low double quotation mark // was 0x201C
0104   case 0xA3:
0105     return 0x00A3; // 2/3 pound sign
0106   case 0xA4:
0107     return 0x0024; // 2/4 dollar sign
0108   case 0xA5:
0109     return 0x00A5; // 2/5 yen sign
0110   case 0xA6:
0111     return 0x2020; // 2/6 single dagger
0112   case 0xA7:
0113     return 0x00A7; // 2/7 paragraph (section)
0114   case 0xA8:
0115     return 0x2032; // 2/8 prime
0116   case 0xA9:
0117     return 0x2018; // 2/9 left high single quotation mark
0118   case 0xAA:
0119     return 0x201C; // 2/10 left high double quotation mark
0120   case 0xAB:
0121     return 0x00AB; // 2/11 left angle quotation mark
0122   case 0xAC:
0123     return 0x266D; // 2/12 music flat
0124   case 0xAD:
0125     return 0x00A9; // 2/13 copyright sign
0126   case 0xAE:
0127     return 0x2117; // 2/14 sound recording copyright sign
0128   case 0xAF:
0129     return 0x00AE; // 2/15 trade mark sign
0130 
0131   case 0xB0:
0132     return 0x0639; // 3/0 ayn [ain]
0133   case 0xB1:
0134     return 0x0623; // 3/1 alif/hamzah [alef with hamza above]
0135   case 0xB2:
0136     return 0x201A; // 3/2 left low single quotation mark // was 0x2018
0137   // 3/3 (this position shall not be used)
0138   // 3/4 (this position shall not be used)
0139   // 3/5 (this position shall not be used)
0140   case 0xB6:
0141     return 0x2021; // 3/6 double dagger
0142   case 0xB7:
0143     return 0x00B7; // 3/7 middle dot
0144   case 0xB8:
0145     return 0x2033; // 3/8 double prime
0146   case 0xB9:
0147     return 0x2019; // 3/9 right high single quotation mark
0148   case 0xBA:
0149     return 0x201D; // 3/10 right high double quotation mark
0150   case 0xBB:
0151     return 0x00BB; // 3/11 right angle quotation mark
0152   case 0xBC:
0153     return 0x266F; // 3/12 musical sharp
0154   case 0xBD:
0155     return 0x02B9; // 3/13 mjagkij znak
0156   case 0xBE:
0157     return 0x02BA; // 3/14 tverdyj znak
0158   case 0xBF:
0159     return 0x00BF; // 3/15 inverted question mark
0160 
0161   // 4/0 to 5/15 diacritic characters
0162 
0163   // 6/0 (this position shall not be used)
0164   case 0xE1:
0165     return 0x00C6; // 6/1 CAPITAL DIPHTHONG A WITH E
0166   case 0xE2:
0167     return 0x0110; // 6/2 CAPITAL LETTER D WITH STROKE
0168   // 6/3 (this position shall not be used)
0169   // 6/4 (this position shall not be used)
0170   // 6/5 (this position shall not be used)
0171   case 0xE6:
0172     return 0x0132; // 6/6 CAPITAL LETTER IJ
0173   // 6/7 (this position shall not be used)
0174   case 0xE8:
0175     return 0x0141; // 6/8 CAPITAL LETTER L WITH STROKE
0176   case 0xE9:
0177     return 0x00D8; // 6/9 CAPITAL LETTER O WITH SOLIDUS [oblique stroke]
0178   case 0xEA:
0179     return 0x0152; // 6/10 CAPITAL DIPHTONG OE
0180   // 6/11 (this position shall not be used)
0181   case 0xEC:
0182     return 0x00DE; // 6/12 CAPITAL LETTER THORN
0183   // 6/13 (this position shall not be used)
0184   // 6/14 (this position shall not be used)
0185   // 6/15 (this position shall not be used)
0186 
0187   // 7/0 (this position shall not be used)
0188   case 0xF1:
0189     return 0x00E6; // 7/1 small diphthong a with e
0190   case 0xF2:
0191     return 0x0111; // small letter d with stroke
0192   case 0xF3:
0193     return 0x00F0; // small letter eth
0194   // 7/4 (this position shall not be used)
0195   case 0xF5:
0196     return 0x0131; // 7/5 small letter i without dot
0197   case 0xF6:
0198     return 0x0133; // 7/6 small letter ij
0199   // 7/7 (this position shall not be used)
0200   case 0xF8:
0201     return 0x0142; // 7/8 small letter l with stroke
0202   case 0xF9:
0203     return 0x00F8; // 7/9 small letter o with solidus (oblique stroke)
0204   case 0xFA:
0205     return 0x0153; // 7/10 small diphtong oe
0206   case 0xFB:
0207     return 0x00DF; // 7/11 small letter sharp s
0208   case 0xFC:
0209     return 0x00FE; // 7/12 small letter thorn
0210   // 7/13 (this position shall not be used)
0211   // 7/14 (this position shall not be used)
0212   default:
0213     return QLatin1Char(c);
0214   }
0215 }
0216 
0217 QChar Iso5426Converter::getCombiningChar(uint c) {
0218   switch(c) {
0219   // 4/0 low rising tone mark
0220   case 0xC041:
0221     return 0x1EA2; // CAPITAL A WITH HOOK ABOVE
0222   case 0xC045:
0223     return 0x1EBA; // CAPITAL E WITH HOOK ABOVE
0224   case 0xC049:
0225     return 0x1EC8; // CAPITAL I WITH HOOK ABOVE
0226   case 0xC04F:
0227     return 0x1ECE; // CAPITAL O WITH HOOK ABOVE
0228   case 0xC055:
0229     return 0x1EE6; // CAPITAL U WITH HOOK ABOVE
0230   case 0xC059:
0231     return 0x1EF6; // CAPITAL Y WITH HOOK ABOVE
0232   case 0xC061:
0233     return 0x1EA3; // small a with hook above
0234   case 0xC065:
0235     return 0x1EBB; // small e with hook above
0236   case 0xC069:
0237     return 0x1EC9; // small i with hook above
0238   case 0xC06F:
0239     return 0x1ECF; // small o with hook above
0240   case 0xC075:
0241     return 0x1EE7; // small u with hook above
0242   case 0xC079:
0243     return 0x1EF7; // small y with hook above
0244 
0245   // 4/1 grave accent
0246   case 0xC141:
0247     return 0x00C0; // CAPITAL A WITH GRAVE ACCENT
0248   case 0xC145:
0249     return 0x00C8; // CAPITAL E WITH GRAVE ACCENT
0250   case 0xC149:
0251     return 0x00CC; // CAPITAL I WITH GRAVE ACCENT
0252   case 0xC14E:
0253     return 0x01F8; // CAPITAL LETTER N WITH GRAVE
0254   case 0xC14F:
0255     return 0x00D2; // CAPITAL O WITH GRAVE ACCENT
0256   case 0xC155:
0257     return 0x00D9; // CAPITAL U WITH GRAVE ACCENT
0258   case 0xC157:
0259     return 0x1E80; // CAPITAL W WITH GRAVE
0260   case 0xC159:
0261     return 0x1EF2; // CAPITAL Y WITH GRAVE
0262   case 0xC161:
0263     return 0x00E0; // small a with grave accent
0264   case 0xC165:
0265     return 0x00E8; // small e with grave accent
0266   case 0xC169:
0267     return 0x00EC; // small i with grave accent
0268   case 0xC16E:
0269     return 0x01F9; // SMALL LETTER N WITH GRAVE
0270   case 0xC16F:
0271     return 0x00F2; // small o with grave accent
0272   case 0xC175:
0273     return 0x00F9; // small u with grave accent
0274   case 0xC177:
0275     return 0x1E81; // small w with grave
0276   case 0xC179:
0277     return 0x1EF3; // small y with grave
0278 
0279   // 4/2 acute accent
0280   case 0xC241:
0281     return 0x00C1; // CAPITAL A WITH ACUTE ACCENT
0282   case 0xC243:
0283     return 0x0106; // CAPITAL C WITH ACUTE ACCENT
0284   case 0xC245:
0285     return 0x00C9; // CAPITAL E WITH ACUTE ACCENT
0286   case 0xC247:
0287     return 0x01F4; // CAPITAL G WITH ACUTE
0288   case 0xC249:
0289     return 0x00CD; // CAPITAL I WITH ACUTE ACCENT
0290   case 0xC24B:
0291     return 0x1E30; // CAPITAL K WITH ACUTE
0292   case 0xC24C:
0293     return 0x0139; // CAPITAL L WITH ACUTE ACCENT
0294   case 0xC24D:
0295     return 0x1E3E; // CAPITAL M WITH ACUTE
0296   case 0xC24E:
0297     return 0x0143; // CAPITAL N WITH ACUTE ACCENT
0298   case 0xC24F:
0299     return 0x00D3; // CAPITAL O WITH ACUTE ACCENT
0300   case 0xC250:
0301     return 0x1E54; // CAPITAL P WITH ACUTE
0302   case 0xC252:
0303     return 0x0154; // CAPITAL R WITH ACUTE ACCENT
0304   case 0xC253:
0305     return 0x015A; // CAPITAL S WITH ACUTE ACCENT
0306   case 0xC255:
0307     return 0x00DA; // CAPITAL U WITH ACUTE ACCENT
0308   case 0xC257:
0309     return 0x1E82; // CAPITAL W WITH ACUTE
0310   case 0xC259:
0311     return 0x00DD; // CAPITAL Y WITH ACUTE ACCENT
0312   case 0xC25A:
0313     return 0x0179; // CAPITAL Z WITH ACUTE ACCENT
0314   case 0xC261:
0315     return 0x00E1; // small a with acute accent
0316   case 0xC263:
0317     return 0x0107; // small c with acute accent
0318   case 0xC265:
0319     return 0x00E9; // small e with acute accent
0320   case 0xC267:
0321     return 0x01F5; // small g with acute
0322   case 0xC269:
0323     return 0x00ED; // small i with acute accent
0324   case 0xC26B:
0325     return 0x1E31; // small k with acute
0326   case 0xC26C:
0327     return 0x013A; // small l with acute accent
0328   case 0xC26D:
0329     return 0x1E3F; // small m with acute
0330   case 0xC26E:
0331     return 0x0144; // small n with acute accent
0332   case 0xC26F:
0333     return 0x00F3; // small o with acute accent
0334   case 0xC270:
0335     return 0x1E55; // small p with acute
0336   case 0xC272:
0337     return 0x0155; // small r with acute accent
0338   case 0xC273:
0339     return 0x015B; // small s with acute accent
0340   case 0xC275:
0341     return 0x00FA; // small u with acute accent
0342   case 0xC277:
0343     return 0x1E83; // small w with acute
0344   case 0xC279:
0345     return 0x00FD; // small y with acute accent
0346   case 0xC27A:
0347     return 0x017A; // small z with acute accent
0348   case 0xC2E1:
0349     return 0x01FC; // CAPITAL AE WITH ACUTE
0350   case 0xC2E9:
0351     return 0x01FE; // CAPITAL LETTER O WITH STROKE AND ACUTE
0352   case 0xC2F1:
0353     return 0x01FD; // SMALL LETTER AE WITH ACUTE
0354   case 0xC2F9:
0355     return 0x01FF; // Small LETTER O WITH STROKE AND ACUTE
0356 
0357   // 4/3 circumflex accent
0358   case 0xC341:
0359     return 0x00C2; // CAPITAL A WITH CIRCUMFLEX ACCENT
0360   case 0xC343:
0361     return 0x0108; // CAPITAL C WITH CIRCUMFLEX
0362   case 0xC345:
0363     return 0x00CA; // CAPITAL E WITH CIRCUMFLEX ACCENT
0364   case 0xC347:
0365     return 0x011C; // CAPITAL G WITH CIRCUMFLEX
0366   case 0xC348:
0367     return 0x0124; // CAPITAL H WITH CIRCUMFLEX
0368   case 0xC349:
0369     return 0x00CE; // CAPITAL I WITH CIRCUMFLEX ACCENT
0370   case 0xC34A:
0371     return 0x0134; // CAPITAL J WITH CIRCUMFLEX
0372   case 0xC34F:
0373     return 0x00D4; // CAPITAL O WITH CIRCUMFLEX ACCENT
0374   case 0xC353:
0375     return 0x015C; // CAPITAL S WITH CIRCUMFLEX
0376   case 0xC355:
0377     return 0x00DB; // CAPITAL U WITH CIRCUMFLEX
0378   case 0xC357:
0379     return 0x0174; // CAPITAL W WITH CIRCUMFLEX
0380   case 0xC359:
0381     return 0x0176; // CAPITAL Y WITH CIRCUMFLEX
0382   case 0xC35A:
0383     return 0x1E90; // CAPITAL Z WITH CIRCUMFLEX
0384   case 0xC361:
0385     return 0x00E2; // small a with circumflex accent
0386   case 0xC363:
0387     return 0x0109; // small c with circumflex
0388   case 0xC365:
0389     return 0x00EA; // small e with circumflex accent
0390   case 0xC367:
0391     return 0x011D; // small g with circumflex
0392   case 0xC368:
0393     return 0x0125; // small h with circumflex
0394   case 0xC369:
0395     return 0x00EE; // small i with circumflex accent
0396   case 0xC36A:
0397     return 0x0135; // small j with circumflex
0398   case 0xC36F:
0399     return 0x00F4; // small o with circumflex accent
0400   case 0xC373:
0401     return 0x015D; // small s with circumflex
0402   case 0xC375:
0403     return 0x00FB; // small u with circumflex
0404   case 0xC377:
0405     return 0x0175; // small w with circumflex
0406   case 0xC379:
0407     return 0x0177; // small y with circumflex
0408   case 0xC37A:
0409     return 0x1E91; // small z with circumflex
0410 
0411   // 4/4 tilde
0412   case 0xC441:
0413     return 0x00C3; // CAPITAL A WITH TILDE
0414   case 0xC445:
0415     return 0x1EBC; // CAPITAL E WITH TILDE
0416   case 0xC449:
0417     return 0x0128; // CAPITAL I WITH TILDE
0418   case 0xC44E:
0419     return 0x00D1; // CAPITAL N WITH TILDE
0420   case 0xC44F:
0421     return 0x00D5; // CAPITAL O WITH TILDE
0422   case 0xC455:
0423     return 0x0168; // CAPITAL U WITH TILDE
0424   case 0xC456:
0425     return 0x1E7C; // CAPITAL V WITH TILDE
0426   case 0xC459:
0427     return 0x1EF8; // CAPITAL Y WITH TILDE
0428   case 0xC461:
0429     return 0x00E3; // small a with tilde
0430   case 0xC465:
0431     return 0x1EBD; // small e with tilde
0432   case 0xC469:
0433     return 0x0129; // small i with tilde
0434   case 0xC46E:
0435     return 0x00F1; // small n with tilde
0436   case 0xC46F:
0437     return 0x00F5; // small o with tilde
0438   case 0xC475:
0439     return 0x0169; // small u with tilde
0440   case 0xC476:
0441     return 0x1E7D; // small v with tilde
0442   case 0xC479:
0443     return 0x1EF9; // small y with tilde
0444   case 0xC4E1: // is this an error
0445     return 0x01E2; // CAPITAL AE WITH MACRON
0446   case 0xC4F1:
0447     return 0x01E3; // small ae with macron
0448 
0449   // 4/5 macron
0450   case 0xC541:
0451     return 0x0100; // CAPITAL A WITH MACRON
0452   case 0xC545:
0453     return 0x0112; // CAPITAL E WITH MACRON
0454   case 0xC547:
0455     return 0x1E20; // CAPITAL G WITH MACRON
0456   case 0xC549:
0457     return 0x012A; // CAPITAL I WITH MACRON
0458   case 0xC54F:
0459     return 0x014C; // CAPITAL O WITH MACRON
0460   case 0xC555:
0461     return 0x016A; // CAPITAL U WITH MACRON
0462   case 0xC559:
0463     return 0x0232; // CAPITAL LETTER Y WITH MACRON
0464   case 0xC561:
0465     return 0x0101; // small a with macron
0466   case 0xC565:
0467     return 0x0113; // small e with macron
0468   case 0xC567:
0469     return 0x1E21; // small g with macron
0470   case 0xC569:
0471     return 0x012B; // small i with macron
0472   case 0xC56F:
0473     return 0x014D; // small o with macron
0474   case 0xC575:
0475     return 0x016B; // small u with macron
0476   case 0xC579:
0477     return 0x0233; // Small LETTER Y WITH MACRON
0478   case 0xC5E1:
0479     return 0x01E2; // CAPITAL AE WITH MACRON
0480   case 0xC5F1:
0481     return 0x01E3; // small ae with macron
0482 
0483   // 4/6 breve
0484   case 0xC641:
0485     return 0x0102; // CAPITAL A WITH BREVE
0486   case 0xC645:
0487     return 0x0114; // CAPITAL E WITH BREVE
0488   case 0xC647:
0489     return 0x011E; // CAPITAL G WITH BREVE
0490   case 0xC649:
0491     return 0x012C; // CAPITAL I WITH BREVE
0492   case 0xC64F:
0493     return 0x014E; // CAPITAL O WITH BREVE
0494   case 0xC655:
0495     return 0x016C; // CAPITAL U WITH BREVE
0496   case 0xC661:
0497     return 0x0103; // small a with breve
0498   case 0xC665:
0499     return 0x0115; // small e with breve
0500   case 0xC667:
0501     return 0x011F; // small g with breve
0502   case 0xC669:
0503     return 0x012D; // small i with breve
0504   case 0xC66F:
0505     return 0x014F; // small o with breve
0506   case 0xC675:
0507     return 0x016D; // small u with breve
0508 
0509   // 4/7 dot above
0510   case 0xC741:
0511     return 0x0226; // CAPITAL LETTER A WITH DOT ABOVE
0512   case 0xC742:
0513     return 0x1E02; // CAPITAL B WITH DOT ABOVE
0514   case 0xC743:
0515     return 0x010A; // CAPITAL C WITH DOT ABOVE
0516   case 0xC744:
0517     return 0x1E0A; // CAPITAL D WITH DOT ABOVE
0518   case 0xC745:
0519     return 0x0116; // CAPITAL E WITH DOT ABOVE
0520   case 0xC746:
0521     return 0x1E1E; // CAPITAL F WITH DOT ABOVE
0522   case 0xC747:
0523     return 0x0120; // CAPITAL G WITH DOT ABOVE
0524   case 0xC748:
0525     return 0x1E22; // CAPITAL H WITH DOT ABOVE
0526   case 0xC749:
0527     return 0x0130; // CAPITAL I WITH DOT ABOVE
0528   case 0xC74D:
0529     return 0x1E40; // CAPITAL M WITH DOT ABOVE
0530   case 0xC74E:
0531     return 0x1E44; // CAPITAL N WITH DOT ABOVE
0532   case 0xC74F:
0533     return 0x022E; // CAPITAL LETTER O WITH DOT ABOVE
0534   case 0xC750:
0535     return 0x1E56; // CAPITAL P WITH DOT ABOVE
0536   case 0xC752:
0537     return 0x1E58; // CAPITAL R WITH DOT ABOVE
0538   case 0xC753:
0539     return 0x1E60; // CAPITAL S WITH DOT ABOVE
0540   case 0xC754:
0541     return 0x1E6A; // CAPITAL T WITH DOT ABOVE
0542   case 0xC757:
0543     return 0x1E86; // CAPITAL W WITH DOT ABOVE
0544   case 0xC758:
0545     return 0x1E8A; // CAPITAL X WITH DOT ABOVE
0546   case 0xC759:
0547     return 0x1E8E; // CAPITAL Y WITH DOT ABOVE
0548   case 0xC75A:
0549     return 0x017B; // CAPITAL Z WITH DOT ABOVE
0550   case 0xC761:
0551     return 0x0227; // small LETTER A WITH DOT ABOVE
0552   case 0xC762:
0553     return 0x1E03; // small b with dot above
0554   case 0xC763:
0555     return 0x010B; // small c with dot above
0556   case 0xC764:
0557     return 0x1E0B; // small d with dot above
0558   case 0xC765:
0559     return 0x0117; // small e with dot above
0560   case 0xC766:
0561     return 0x1E1F; // small f with dot above
0562   case 0xC767:
0563     return 0x0121; // small g with dot above
0564   case 0xC768:
0565     return 0x1E23; // small h with dot above
0566   case 0xC76D:
0567     return 0x1E41; // small m with dot above
0568   case 0xC76E:
0569     return 0x1E45; // small n with dot above
0570   case 0xC76F:
0571     return 0x022F; // SMALL LETTER O WITH DOT ABOVE
0572   case 0xC770:
0573     return 0x1E57; // small p with dot above
0574   case 0xC772:
0575     return 0x1E59; // small r with dot above
0576   case 0xC773:
0577     return 0x1E61; // small s with dot above
0578   case 0xC774:
0579     return 0x1E6B; // small t with dot above
0580   case 0xC777:
0581     return 0x1E87; // small w with dot above
0582   case 0xC778:
0583     return 0x1E8B; // small x with dot above
0584   case 0xC779:
0585     return 0x1E8F; // small y with dot above
0586   case 0xC77A:
0587     return 0x017C; // small z with dot above
0588 
0589   // 4/8 trema, diaresis
0590   case 0xC820:
0591     return 0x00A8; // diaeresis
0592   case 0xC841:
0593     return 0x00C4; // CAPITAL A WITH DIAERESIS
0594   case 0xC845:
0595     return 0x00CB; // CAPITAL E WITH DIAERESIS
0596   case 0xC848:
0597     return 0x1E26; // CAPITAL H WITH DIAERESIS
0598   case 0xC849:
0599     return 0x00CF; // CAPITAL I WITH DIAERESIS
0600   case 0xC84F:
0601     return 0x00D6; // CAPITAL O WITH DIAERESIS
0602   case 0xC855:
0603     return 0x00DC; // CAPITAL U WITH DIAERESIS
0604   case 0xC857:
0605     return 0x1E84; // CAPITAL W WITH DIAERESIS
0606   case 0xC858:
0607     return 0x1E8C; // CAPITAL X WITH DIAERESIS
0608   case 0xC859:
0609     return 0x0178; // CAPITAL Y WITH DIAERESIS
0610   case 0xC861:
0611     return 0x00E4; // small a with diaeresis
0612   case 0xC865:
0613     return 0x00EB; // small e with diaeresis
0614   case 0xC868:
0615     return 0x1E27; // small h with diaeresis
0616   case 0xC869:
0617     return 0x00EF; // small i with diaeresis
0618   case 0xC86F:
0619     return 0x00F6; // small o with diaeresis
0620   case 0xC874:
0621     return 0x1E97; // small t with diaeresis
0622   case 0xC875:
0623     return 0x00FC; // small u with diaeresis
0624   case 0xC877:
0625     return 0x1E85; // small w with diaeresis
0626   case 0xC878:
0627     return 0x1E8D; // small x with diaeresis
0628   case 0xC879:
0629     return 0x00FF; // small y with diaeresis
0630 
0631   // 4/9 umlaut
0632   case 0xC920:
0633     return 0x00A8; // [diaeresis]
0634 
0635   // 4/10 circle above
0636   case 0xCA41:
0637     return 0x00C5; // CAPITAL A WITH RING ABOVE
0638   case 0xCA55: // was CAAD
0639     return 0x016E; // CAPITAL U WITH RING ABOVE
0640   case 0xCA61:
0641     return 0x00E5; // small a with ring above
0642   case 0xCA75:
0643     return 0x016F; // small u with ring above
0644   case 0xCA77:
0645     return 0x1E98; // small w with ring above
0646   case 0xCA79:
0647     return 0x1E99; // small y with ring above
0648 
0649   // 4/11 high comma off centre
0650 
0651   // 4/12 inverted high comma centred
0652 
0653   // 4/13 double acute accent
0654   case 0xCD4F:
0655     return 0x0150; // CAPITAL O WITH DOUBLE ACUTE
0656   case 0xCD55:
0657     return 0x0170; // CAPITAL U WITH DOUBLE ACUTE
0658   case 0xCD6F:
0659     return 0x0151; // small o with double acute
0660   case 0xCD75:
0661     return 0x0171; // small u with double acute
0662 
0663   // 4/14 horn
0664   case 0xCE4F: // was 0xCE54
0665     return 0x01A0; // LATIN CAPITAL LETTER O WITH HORN
0666   case 0xCE55:
0667     return 0x01AF; // LATIN CAPITAL LETTER U WITH HORN
0668   case 0xCE6F: // was 0xCE74
0669     return 0x01A1; // latin small letter o with horn
0670   case 0xCE75:
0671     return 0x01B0; // latin small letter u with horn
0672 
0673   // 4/15 caron (hacek)
0674   case 0xCF41:
0675     return 0x01CD; // CAPITAL A WITH CARON
0676   case 0xCF43:
0677     return 0x010C; // CAPITAL C WITH CARON
0678   case 0xCF44:
0679     return 0x010E; // CAPITAL D WITH CARON
0680   case 0xCF45:
0681     return 0x011A; // CAPITAL E WITH CARON
0682   case 0xCF47:
0683     return 0x01E6; // CAPITAL G WITH CARON
0684   case 0xCF48:
0685     return 0x021E; // CAPITAL LETTER H WITH CARON
0686   case 0xCF49:
0687     return 0x01CF; // CAPITAL I WITH CARON
0688   case 0xCF4B:
0689     return 0x01E8; // CAPITAL K WITH CARON
0690   case 0xCF4C:
0691     return 0x013D; // CAPITAL L WITH CARON
0692   case 0xCF4E:
0693     return 0x0147; // CAPITAL N WITH CARON
0694   case 0xCF4F:
0695     return 0x01D1; // CAPITAL O WITH CARON
0696   case 0xCF52:
0697     return 0x0158; // CAPITAL R WITH CARON
0698   case 0xCF53:
0699     return 0x0160; // CAPITAL S WITH CARON
0700   case 0xCF54:
0701     return 0x0164; // CAPITAL T WITH CARON
0702   case 0xCF55:
0703     return 0x01D3; // CAPITAL U WITH CARON
0704   case 0xCF5A:
0705     return 0x017D; // CAPITAL Z WITH CARON
0706   case 0xCF61:
0707     return 0x01CE; // small a with caron
0708   case 0xCF63:
0709     return 0x010D; // small c with caron
0710   case 0xCF64:
0711     return 0x010F; // small d with caron
0712   case 0xCF65:
0713     return 0x011B; // small e with caron
0714   case 0xCF67:
0715     return 0x01E7; // small g with caron
0716   case 0xCF68:
0717     return 0x021F; // small LETTER H WITH CARON
0718   case 0xCF69:
0719     return 0x01D0; // small i with caron
0720   case 0xCF6A:
0721     return 0x01F0; // small j with caron
0722   case 0xCF6B:
0723     return 0x01E9; // small k with caron
0724   case 0xCF6C:
0725     return 0x013E; // small l with caron
0726   case 0xCF6E:
0727     return 0x0148; // small n with caron
0728   case 0xCF6F:
0729     return 0x01D2; // small o with caron
0730   case 0xCF72:
0731     return 0x0159; // small r with caron
0732   case 0xCF73:
0733     return 0x0161; // small s with caron
0734   case 0xCF74:
0735     return 0x0165; // small t with caron
0736   case 0xCF75:
0737     return 0x01D4; // small u with caron
0738   case 0xCF7A:
0739     return 0x017E; // small z with caron
0740 
0741   // 5/0 cedilla
0742   case 0xD020:
0743     return 0x00B8; // cedilla
0744   case 0xD043:
0745     return 0x00C7; // CAPITAL C WITH CEDILLA
0746   case 0xD044:
0747     return 0x1E10; // CAPITAL D WITH CEDILLA
0748   case 0xD045:
0749     return 0x0228; // CAPITAL LETTER E WITH CEDILLA
0750   case 0xD047:
0751     return 0x0122; // CAPITAL G WITH CEDILLA
0752   case 0xD048:
0753     return 0x1E28; // CAPITAL H WITH CEDILLA
0754   case 0xD04B:
0755     return 0x0136; // CAPITAL K WITH CEDILLA
0756   case 0xD04C:
0757     return 0x013B; // CAPITAL L WITH CEDILLA
0758   case 0xD04E:
0759     return 0x0145; // CAPITAL N WITH CEDILLA
0760   case 0xD052:
0761     return 0x0156; // CAPITAL R WITH CEDILLA
0762   case 0xD053:
0763     return 0x015E; // CAPITAL S WITH CEDILLA
0764   case 0xD054:
0765     return 0x0162; // CAPITAL T WITH CEDILLA
0766   case 0xD063:
0767     return 0x00E7; // small c with cedilla
0768   case 0xD064:
0769     return 0x1E11; // small d with cedilla
0770   case 0xD065:
0771     return 0x0229; // small LETTER E WITH CEDILLA
0772   case 0xD067:
0773     return 0x0123; // small g with cedilla
0774   case 0xD068:
0775     return 0x1E29; // small h with cedilla
0776   case 0xD06B:
0777     return 0x0137; // small k with cedilla
0778   case 0xD06C:
0779     return 0x013C; // small l with cedilla
0780   case 0xD06E:
0781     return 0x0146; // small n with cedilla
0782   case 0xD072:
0783     return 0x0157; // small r with cedilla
0784   case 0xD073:
0785     return 0x015F; // small s with cedilla
0786   case 0xD074:
0787     return 0x0163; // small t with cedilla
0788 
0789   // 5/1 rude
0790 
0791   // 5/2 hook to left
0792   case 0xD253:
0793     return 0x0218; // CAPITAL LETTER S WITH COMMA BELOW
0794   case 0xD254:
0795     return 0x021A; // CAPITAL LETTER T WITH COMMA BELOW
0796   case 0xD273:
0797     return 0x0219; // Small LETTER S WITH COMMA BELOW
0798   case 0xD274:
0799     return 0x021B; // Small LETTER T WITH COMMA BELOW
0800 
0801   // 5/3 ogonek (hook to right)
0802   case 0xD320:
0803     return 0x02DB; // ogonek
0804   case 0xD341:
0805     return 0x0104; // CAPITAL A WITH OGONEK
0806   case 0xD345:
0807     return 0x0118; // CAPITAL E WITH OGONEK
0808   case 0xD349:
0809     return 0x012E; // CAPITAL I WITH OGONEK
0810   case 0xD34F:
0811     return 0x01EA; // CAPITAL O WITH OGONEK
0812   case 0xD355:
0813     return 0x0172; // CAPITAL U WITH OGONEK
0814   case 0xD361:
0815     return 0x0105; // small a with ogonek
0816   case 0xD365:
0817     return 0x0119; // small e with ogonek
0818   case 0xD369:
0819     return 0x012F; // small i with ogonek
0820   case 0xD36F:
0821     return 0x01EB; // small o with ogonek
0822   case 0xD375:
0823     return 0x0173; // small u with ogonek
0824 
0825   // 5/4 circle below
0826   case 0xD441:
0827     return 0x1E00; // CAPITAL A WITH RING BELOW
0828   case 0xD461:
0829     return 0x1E01; // small a with ring below
0830   case 0xD548:
0831     return 0x1E2A; // CAPITAL LETTER H WITH BREVE BELOW
0832   case 0xD568:
0833     return 0x1E2B; // small LETTER H WITH BREVE BELOW
0834 
0835   // 5/6 dot below
0836   case 0xD641:
0837     return 0x1EA0; // CAPITAL A WITH DOT BELOW
0838   case 0xD642:
0839     return 0x1E04; // CAPITAL B WITH DOT BELOW
0840   case 0xD644:
0841     return 0x1E0C; // CAPITAL D WITH DOT BELOW
0842   case 0xD645:
0843     return 0x1EB8; // CAPITAL E WITH DOT BELOW
0844   case 0xD648:
0845     return 0x1E24; // CAPITAL H WITH DOT BELOW
0846   case 0xD649:
0847     return 0x1ECA; // CAPITAL I WITH DOT BELOW
0848   case 0xD64B:
0849     return 0x1E32; // CAPITAL K WITH DOT BELOW
0850   case 0xD64C:
0851     return 0x1E36; // CAPITAL L WITH DOT BELOW
0852   case 0xD64D:
0853     return 0x1E42; // CAPITAL M WITH DOT BELOW
0854   case 0xD64E:
0855     return 0x1E46; // CAPITAL N WITH DOT BELOW
0856   case 0xD64F:
0857     return 0x1ECC; // CAPITAL O WITH DOT BELOW
0858   case 0xD652:
0859     return 0x1E5A; // CAPITAL R WITH DOT BELOW
0860   case 0xD653:
0861     return 0x1E62; // CAPITAL S WITH DOT BELOW
0862   case 0xD654:
0863     return 0x1E6C; // CAPITAL T WITH DOT BELOW
0864   case 0xD655:
0865     return 0x1EE4; // CAPITAL U WITH DOT BELOW
0866   case 0xD656:
0867     return 0x1E7E; // CAPITAL V WITH DOT BELOW
0868   case 0xD657:
0869     return 0x1E88; // CAPITAL W WITH DOT BELOW
0870   case 0xD659:
0871     return 0x1EF4; // CAPITAL Y WITH DOT BELOW
0872   case 0xD65A:
0873     return 0x1E92; // CAPITAL Z WITH DOT BELOW
0874   case 0xD661:
0875     return 0x1EA1; // small a with dot below
0876   case 0xD662:
0877     return 0x1E05; // small b with dot below
0878   case 0xD664:
0879     return 0x1E0D; // small d with dot below
0880   case 0xD665:
0881     return 0x1EB9; // small e with dot below
0882   case 0xD668:
0883     return 0x1E25; // small h with dot below
0884   case 0xD669:
0885     return 0x1ECB; // small i with dot below
0886   case 0xD66B:
0887     return 0x1E33; // small k with dot below
0888   case 0xD66C:
0889     return 0x1E37; // small l with dot below
0890   case 0xD66D:
0891     return 0x1E43; // small m with dot below
0892   case 0xD66E:
0893     return 0x1E47; // small n with dot below
0894   case 0xD66F:
0895     return 0x1ECD; // small o with dot below
0896   case 0xD672:
0897     return 0x1E5B; // small r with dot below
0898   case 0xD673:
0899     return 0x1E63; // small s with dot below
0900   case 0xD674:
0901     return 0x1E6D; // small t with dot below
0902   case 0xD675:
0903     return 0x1EE5; // small u with dot below
0904   case 0xD676:
0905     return 0x1E7F; // small v with dot below
0906   case 0xD677:
0907     return 0x1E89; // small w with dot below
0908   case 0xD679:
0909     return 0x1EF5; // small y with dot below
0910   case 0xD67A:
0911     return 0x1E93; // small z with dot below
0912 
0913   // 5/7 double dot below
0914   case 0xD755:
0915     return 0x1E72; // CAPITAL U WITH DIAERESIS BELOW
0916   case 0xD775:
0917     return 0x1E73; // small u with diaeresis below
0918 
0919   // 5/8 underline
0920   case 0xD820:
0921     return 0x005F; // underline
0922 
0923   // 5/9 double underline
0924   case 0xD920:
0925     return 0x2017; // double underline
0926 
0927   // 5/10 small low vertical bar
0928   case 0xDA20:
0929     return 0x02CC; //
0930 
0931   case 0xDB44:
0932     return 0x1E12; // CAPITAL LETTER D WITH CIRCUMFLEX BELOW
0933   case 0xDB45:
0934     return 0x1E18; // CAPITAL LETTER E WITH CIRCUMFLEX BELOW
0935   case 0xDB4C:
0936     return 0x1E3C; // CAPITAL LETTER L WITH CIRCUMFLEX BELOW
0937   case 0xDB4E:
0938     return 0x1E4A; // CAPITAL LETTER N WITH CIRCUMFLEX BELOW
0939   case 0xDB54:
0940     return 0x1E70; // CAPITAL LETTER T WITH CIRCUMFLEX BELOW
0941   case 0xDB55:
0942     return 0x1E76; // CAPITAL LETTER U WITH CIRCUMFLEX BELOW
0943   case 0xDB64:
0944     return 0x1E13; // SMALL LETTER D WITH CIRCUMFLEX BELOW
0945   case 0xDB65:
0946     return 0x1E19; // SMALL LETTER E WITH CIRCUMFLEX BELOW
0947   case 0xDB6C:
0948     return 0x1E3D; // Small LETTER L WITH CIRCUMFLEX BELOW
0949   case 0xDB6E:
0950     return 0x1E4B; // SMALL LETTER N WITH CIRCUMFLEX BELOW
0951   case 0xDB74:
0952     return 0x1E71; // SMALL LETTER T WITH CIRCUMFLEX BELOW
0953   case 0xDB75:
0954     return 0x1E77; // SMALL LETTER U WITH CIRCUMFLEX BELOW
0955 
0956   // 5/5 half circle below
0957   case 0xF948:
0958     return 0x1E2A; // CAPITAL H WITH BREVE BELOW
0959   case 0xF968:
0960     return 0x1E2B; // small h with breve below
0961 
0962   // 5/11 circumflex below
0963 
0964   // 5/12 (this position shall not be used)
0965 
0966   // 5/13 left half of ligature sign and of double tilde
0967 
0968   // 5/14 right half of ligature sign
0969 
0970   // 5/15 right half of double tilde
0971 
0972   case 0xC0C341:
0973     return 0x1EA8; // CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
0974   case 0xC0C345:
0975     return 0x1EC2; // CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
0976   case 0xC0C34F:
0977     return 0x1ED4; // CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
0978   case 0xC0C361:
0979     return 0x1EA9; // SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
0980   case 0xC0C365:
0981     return 0x1EC3; // SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
0982   case 0xC0C36F:
0983     return 0x1ED5; // SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
0984   case 0xC0C641:
0985     return 0x1EB2; // CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
0986   case 0xC0C661:
0987     return 0x1EB3; // SMALL LETTER A WITH BREVE AND HOOK ABOVE
0988   case 0xC0CE4F:
0989     return 0x1EDE; // CAPITAL LETTER O WITH HORN AND HOOK ABOVE
0990   case 0xC0CE55:
0991     return 0x1EEC; // CAPITAL LETTER U WITH HORN AND HOOK ABOVE
0992   case 0xC0CE6F:
0993     return 0x1EDF; // SMALL LETTER O WITH HORN AND HOOK ABOVE
0994   case 0xC0CE75:
0995     return 0x1EED; // SMALL LETTER U WITH HORN AND HOOK ABOVE
0996 
0997   case 0xC1C341:
0998     return 0x1EA6; // CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
0999   case 0xC1C345:
1000     return 0x1EC0; // CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
1001   case 0xC1C34F:
1002     return 0x1ED2; // CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
1003   case 0xC1C361:
1004     return 0x1EA7; // SMALL LETTER A WITH CIRCUMFLEX AND GRAVE
1005   case 0xC1C365:
1006     return 0x1EC1; // SMALL LETTER E WITH CIRCUMFLEX AND GRAVE
1007   case 0xC1C36F:
1008     return 0x1ED3; // SMALL LETTER O WITH CIRCUMFLEX AND GRAVE
1009   case 0xC1C545:
1010     return 0x1E14; // CAPITAL LETTER E WITH MACRON AND GRAVE
1011   case 0xC1C54F:
1012     return 0x1E50; // CAPITAL LETTER O WITH MACRON AND GRAVE
1013   case 0xC1C565:
1014     return 0x1E15; // SMALL LETTER E WITH MACRON AND GRAVE
1015   case 0xC1C56F:
1016     return 0x1E51; // SMALL LETTER O WITH MACRON AND GRAVE
1017   case 0xC1C641:
1018     return 0x1EB0; // CAPITAL LETTER A WITH BREVE AND GRAVE
1019   case 0xC1C661:
1020     return 0x1EB1; // SMALL LETTER A WITH BREVE AND GRAVE
1021   case 0xC1C855:
1022     return 0x01DB; // Capital Letter U with Diaeresis and GRAVE
1023   case 0xC1C875:
1024     return 0x01DC; // Small Letter U with Diaeresis and GRAVE
1025   case 0xC1CE4F:
1026     return 0x1EDC; // CAPITAL LETTER O WITH HORN AND GRAVE
1027   case 0xC1CE55:
1028     return 0x1EEA; // CAPITAL LETTER U WITH HORN AND GRAVE
1029   case 0xC1CE6F:
1030     return 0x1EDD; // SMALL LETTER O WITH HORN AND GRAVE
1031   case 0xC1CE75:
1032     return 0x1EEB; // SMALL LETTER U WITH HORN AND GRAVE
1033 
1034   case 0xC2C341:
1035     return 0x1EA4; // CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
1036   case 0xC2C345:
1037     return 0x1EBE; // CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
1038   case 0xC2C34F:
1039     return 0x1ED0; // CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
1040   case 0xC2C361:
1041     return 0x1EA5; // SMALL LETTER A WITH CIRCUMFLEX AND ACUTE
1042   case 0xC2C365:
1043     return 0x1EBF; // SMALL LETTER E WITH CIRCUMFLEX AND ACUTE
1044   case 0xC2C36F:
1045     return 0x1ED1; // SMALL LETTER O WITH CIRCUMFLEX AND ACUTE
1046   case 0xC2C44F:
1047     return 0x1E4C; // CAPITAL LETTER O WITH TILDE AND ACUTE
1048   case 0xC2C455:
1049     return 0x1E78; // CAPITAL LETTER U WITH TILDE AND ACUTE
1050   case 0xC2C46F:
1051     return 0x1E4D; // SMALL LETTER O WITH TILDE AND ACUTE
1052   case 0xC2C475:
1053     return 0x1E79; // SMALL LETTER U WITH TILDE AND ACUTE
1054   case 0xC2C545:
1055     return 0x1E16; // CAPITAL LETTER E WITH MACRON AND ACUTE
1056   case 0xC2C565:
1057     return 0x1E17; // SMALL LETTER E WITH MACRON AND ACUTE
1058   case 0xC2C54F:
1059     return 0x1E52; // CAPITAL LETTER O WITH MACRON AND ACUTE
1060   case 0xC2C56F:
1061     return 0x1E53; // SMALL LETTER O WITH MACRON AND ACUTE
1062   case 0xC2C641:
1063     return 0x1EAE; // CAPITAL LETTER A WITH BREVE AND ACUTE
1064   case 0xC2C661:
1065     return 0x1EAF; // SMALL LETTER A WITH BREVE AND ACUTE
1066   case 0xC2C849:
1067     return 0x1E2E; // CAPITAL LETTER I WITH DIAERESIS AND ACUTE
1068   case 0xC2C855:
1069     return 0x01D7; // Capital Letter U with Diaeresis and ACUTE
1070   case 0xC2C869:
1071     return 0x1E2F; // Small LETTER I WITH DIAERESIS AND ACUTE
1072   case 0xC2C875:
1073     return 0x01D8; // Small Letter U with Diaeresis and ACUTE
1074   case 0xC2CA41:
1075     return 0x01FA; // CAPITAL LETTER A WITH RING ABOVE AND ACUTE
1076   case 0xC2CA61:
1077     return 0x01FB; // SMALL LETTER A WITH RING ABOVE AND ACUTE
1078   case 0xC2CE4F:
1079     return 0x1EDA; // CAPITAL LETTER O WITH HORN AND ACUTE
1080   case 0xC2CE55:
1081     return 0x1EE8; // CAPITAL LETTER U WITH HORN AND ACUTE
1082   case 0xC2CE6F:
1083     return 0x1EDB; // SMALL LETTER O WITH HORN AND ACUTE
1084   case 0xC2CE75:
1085     return 0x1EE9; // small LETTER U WITH HORN AND ACUTE
1086   case 0xC2D043:
1087     return 0x1E08; // CAPITAL LETTER C WITH CEDILLA AND ACUTE
1088   case 0xC2D063:
1089     return 0x1E09; // Small LETTER C WITH CEDILLA AND ACUTE
1090 
1091   case 0xC3D641:
1092     return 0x1EAC; // CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
1093   case 0xC3D645:
1094     return 0x1EC6; // CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
1095   case 0xC3D64F:
1096     return 0x1ED8; // CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
1097   case 0xC3D661:
1098     return 0x1EAD; // SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW
1099   case 0xC3D665:
1100     return 0x1EC7; // SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW
1101   case 0xC3D66F:
1102     return 0x1ED9; // SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW
1103 
1104   case 0xC4C341:
1105     return 0x1EAA; // CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
1106   case 0xC4C345:
1107     return 0x1EC4; // CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
1108   case 0xC4C34F:
1109     return 0x1ED6; // CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
1110   case 0xC4C361:
1111     return 0x1EAB; // SMALL LETTER A WITH CIRCUMFLEX AND TILDE
1112   case 0xC4C365:
1113     return 0x1EC5; // SMALL LETTER E WITH CIRCUMFLEX AND TILDE
1114   case 0xC4C36F:
1115     return 0x1ED7; // SMALL LETTER O WITH CIRCUMFLEX AND TILDE
1116   case 0xC4C641:
1117     return 0x1EB4; // CAPITAL LETTER A WITH BREVE AND TILDE
1118   case 0xC4C661:
1119     return 0x1EB5; // SMALL LETTER A WITH BREVE AND TILDE
1120   case 0xC4CE4F:
1121     return 0x1EE0; // CAPITAL LETTER O WITH HORN AND TILDE
1122   case 0xC4CE55:
1123     return 0x1EEE; // CAPITAL LETTER U WITH HORN AND TILDE
1124   case 0xC4CE6F:
1125     return 0x1EE1; // SMALL LETTER O WITH HORN AND TILDE
1126   case 0xC4CE75:
1127     return 0x1EEF; // SMALL LETTER U WITH HORN AND TILDE
1128 
1129   case 0xC5C44F:
1130     return 0x022C; // CAPITAL LETTER O WITH TILDE AND MACRON
1131   case 0xC5C741:
1132     return 0x01E0; // CAPITAL LETTER A WITH DOT ABOVE AND MACRON
1133   case 0xC5C74F:
1134     return 0x0230; // CAPITAL LETTER O WITH DOT ABOVE AND MACRON
1135   case 0xC5C761:
1136     return 0x01E1; // SMALL LETTER A WITH DOT ABOVE AND MACRON
1137   case 0xC5C76F:
1138     return 0x0231; // SMALL LETTER O WITH DOT ABOVE AND MACRON
1139   case 0xC5C841:
1140     return 0x01DE; // CAPITAL LETTER A WITH DIAERESIS AND MACRON
1141   case 0xC5C84F:
1142     return 0x022A; // CAPITAL LETTER O WITH DIAERESIS AND MACRON
1143   case 0xC5C855:
1144     return 0x01D5; // Capital Letter U with Diaeresis and Macron
1145   case 0xC5C861:
1146     return 0x01DF; // Small LETTER A WITH DIAERESIS AND MACRON
1147   case 0xC5C875:
1148     return 0x01D6; // Small Letter U with Diaeresis and Macron
1149   case 0xC5D34F:
1150     return 0x01EC; // CAPITAL LETTER O WITH OGONEK AND MACRON
1151   case 0xC5D36F:
1152     return 0x01ED; // SMALL LETTER O WITH OGONEK AND MACRON
1153   case 0xC5C46F:
1154     return 0x022D; // SMALL LETTER O WITH TILDE AND MACRON
1155   case 0xC5D64C:
1156     return 0x1E38; // CAPITAL LETTER L WITH DOT BELOW AND MACRON
1157   case 0xC5D652:
1158     return 0x1E5C; // CAPITAL LETTER R WITH DOT BELOW AND MACRON
1159   case 0xC5D66C:
1160     return 0x1E39; // Small LETTER L WITH DOT BELOW AND MACRON
1161   case 0xC5D672:
1162     return 0x1E5D; // SMALL LETTER R WITH DOT BELOW AND MACRON
1163   case 0xC5C86F:
1164     return 0x022B; // small LETTER O WITH DIAERESIS AND MACRON
1165 
1166   case 0xC6D045:
1167     return 0x1E1C; // CAPITAL LETTER E WITH CEDILLA AND BREVE
1168   case 0xC6D065:
1169     return 0x1E1D; // Small LETTER E WITH CEDILLA AND BREVE
1170   case 0xC6D641:
1171     return 0x1EB6; // CAPITAL LETTER A WITH BREVE AND DOT BELOW
1172   case 0xC6D661:
1173     return 0x1EB7; // SMALL LETTER A WITH BREVE AND DOT BELOW
1174 
1175   case 0xC7C253:
1176     return 0x1E64; // CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
1177   case 0xC7C273:
1178     return 0x1E65; // SMALL LETTER S WITH ACUTE AND DOT ABOVE
1179   case 0xC7CF53:
1180     return 0x1E66; // CAPITAL LETTER S WITH CARON AND DOT ABOVE
1181   case 0xC7CF73:
1182     return 0x1E67; // SMALL LETTER S WITH CARON AND DOT ABOVE
1183   case 0xC7D653:
1184     return 0x1E68; // CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
1185   case 0xC7D673:
1186     return 0x1E69; // SMALL LETTER S WITH DOT BELOW AND DOT ABOVE
1187 
1188   case 0xC8C44F:
1189     return 0x1E4E; // CAPITAL LETTER O WITH TILDE AND DIAERESIS
1190   case 0xC8C46F:
1191     return 0x1E4F; // SMALL LETTER O WITH TILDE AND DIAERESIS
1192   case 0xC8C555:
1193     return 0x1E7A; // CAPITAL LETTER U WITH MACRON AND DIAERESIS
1194   case 0xC8C575:
1195     return 0x1E7B; // SMALL LETTER U WITH MACRON AND DIAERESIS
1196 
1197   case 0xCFC855:
1198     return 0x01D9; // Capital Letter U with Diaeresis and CARON
1199   case 0xCFC875:
1200     return 0x01DA; // Small Letter U with Diaeresis and CARON
1201 
1202   case 0xD6CE4F:
1203     return 0x1EE2; // CAPITAL LETTER O WITH HORN AND DOT BELOW
1204   case 0xD6CE55:
1205     return 0x1EF0; // CAPITAL LETTER U WITH HORN AND DOT BELOW
1206   case 0xD6CE6F:
1207     return 0x1EE3; // SMALL LETTER O WITH HORN AND DOT BELOW
1208   case 0xD6CE75:
1209     return 0x1EF1; // SMALL LETTER U WITH HORN AND DOT BELOW
1210 
1211   default:
1212 #if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
1213     myDebug() << "no match for" << hex << c;
1214 #else
1215     myDebug() << "no match for" << Qt::hex << c;
1216 #endif
1217     return QChar();
1218   }
1219 }