C++ utf8 mb_strtoupper function



#include <iostream>
#include <string>
 
using namespace std;
 
string mb_strtoupper(string m);
 
int main(int argc, char *argv[])
{
    cout << mb_strtoupper("québec") << endl;
    cout << mb_strtoupper("πρστυφχψωϊϋ") << endl;
    return 0;
}
 
string mb_strtoupper(string m)
{
    string out;
    int j=0,k=0;
    for(int i=0, ix=m.length(); i<ix; i+=1, j++)
    {
        unsigned char c0=m[i];
        if  (c0>=0   && c0<=127)
        {
            if ('a'<=c0 && c0<='z') { c0-=0x20; }
            out+= c0;
        }
        else if (c0>=192 && c0<=223)
        {
            unsigned char c1=m[i+1];
            if      (c0==0xc4 && c1==0xb1) { out+=0x49; }
            else if (c0==0xc5 && c1==0xbf) { out+=0x53; }
            else if (c0==0xc2 && c1==0xb5) { out+=0xce;   out+=0x9c; }
            else if (c0==0xc3 && c1==0xbf) { out+=(c0+2); out+=0xb8; }
            else if (c0==0xc5 && c1==0x80) { out+=(c0-1); out+=0xbf; }
            else if (c0==0xd2 && c1==0x81) { out+=c0; out+=(c1-1);   }
            else if (c0==0xce && c1==0xac) { out+=c0; out+=(c1-0x26); }
            else if (c0==0xcf && c1==0x8c) { out+=(c0-1); out+=c1; }
            else if (c0==0xcf && c1==0x90) { out+=(c0-1); out+=(c1+2); }
            else if (c0==0xcf && c1==0x82) { out+=(c0-1); out+=(c1+0x21); }
            else if (c0==0xc9 && c1==0x93) { out+=(c0-3); out+=(c1-0x12); }
            else if (c0==0xc9 && c1==0x94) { out+=(c0-3); out+=(c1-0x0e); }
            else if (c0==0xc9 && c1==0x99) { out+=(c0-3); out+=(c1-0x0a); }
            else if (c0==0xc9 && c1==0x9b) { out+=(c0-3); out+=(c1-0x0b); }
            else if (c0==0xc9 && c1==0xa3) { out+=(c0-3); out+=(c1-0x0f); }
            else if (c0==0xc9 && c1==0xa8) { out+=(c0-3); out+=(c1-0x11); } 
            else if (c0==0xc9 && c1==0xb2) { out+=(c0-3); out+=(c1-0x15); }
            else if (c0==0xc9 && c1==0xb5) { out+=(c0-3); out+=(c1-0x16); }
            else if (c0==0xca && c1==0x92) { out+=(c0-4); out+=(c1+0x25); }
            else if (c0==0xcf && c1==0x91) { out+=(c0-1); out+=(c1+0x07); }
            else if (c0==0xcf && c1==0x95) { out+=(c0-1); out+=(c1+0x11); }
            else if (c0==0xcf && c1==0x96) { out+=(c0-1); out+=(c1+0x0a); }
            else if (c0==0xcf && c1==0xb0) { out+=(c0-1); out+=(c1-0x16); }
            else if (c0==0xcf && c1==0xb1) { out+=(c0-1); out+=(c1-0x10); }
            else if (c0==0xcf && c1==0xb2) { out+=(c0-1); out+=(c1-0x0f); }
            else if (c0==0xc7 && c1==0x9d) { out+=(c0-1); out+=(c1-0x0f); }
            else if (c0==0xcf && c1==0xb5) { out+=(c0-1); out+=(c1-0x20); }
            else if (c0==0xc6 && c1==0xbf) { out+=(c0+1); out+=(c1-0x08); }
            else if (c0==0xc6 && c1==0x95) { out+=(c0+1); out+=(c1+0x21); }
            else if (c0==0xc6 && c1==0x9e) { out+=(c0+2); out+=(c1+0x02); }
            else if (c0==0xd5 && 0xb0<=c1 && c1 <=0xbf ) { out+=c0;     out+=(c1-0x30); }
            else if (c0==0xce && 0xad<=c1 && c1 <=0xaf ) { out+=c0;     out+=(c1-0x25); }
            else if (c0==0xce && 0xb1<=c1 && c1 <=0xbf ) { out+=c0;     out+=(c1-0x20); }
            else if (c0==0xd0 && 0xb0<=c1 && c1 <=0xbf ) { out+=c0;     out+=(c1-0x20); }
            else if (c0==0xd1 && 0x80<=c1 && c1 <=0x8f ) { out+=(c0-1); out+=(c1+0x20); }
            else if (c0==0xd1 && 0x90<=c1 && c1 <=0x9f ) { out+=(c0-1); out+=(c1-0x10); }
            else if (c0==0xd5 && 0xa1<=c1 && c1 <=0xaf ) { out+=(c0-1); out+=(c1+0x10); }
            else if (c0==0xd6 && 0x80<=c1 && c1 <=0x86 ) { out+=(c0-1); out+=(c1+0x10); }
            else if (c0==0xcf && 0x80<=c1 && c1 <=0x81 ) { out+=(c0-1); out+=(c1+0x20); }
            else if (c0==0xcf && 0x83<=c1 && c1 <=0x8b ) { out+=(c0-1); out+=(c1+0x20); }
            else if (c0==0xcf && 0x8d<=c1 && c1 <=0x8e ) { out+=(c0-1); out+=(c1+1);    }
            else if (c0==0xca && 0x8a<=c1 && c1 <=0x8b ) { out+=(c0-4); out+=(c1+0x27); }
            else if (c0==0xc3 && 0xa0<=c1 && c1 <=0xbe && c1!=0xb7) { out+=c0; out+=c1-0x20; }
            else if (c0==0xc4 && 0x81<=c1 && c1 <=0xaf && c1%2==1 ) { out+=c0; out+=(c1-1);  }
            else if (c0==0xc4 && 0xb3<=c1 && c1 <=0xb7 && c1%2==1 ) { out+=c0; out+=(c1-1);  }
            else if (c0==0xc4 && 0xba<=c1 && c1 <=0xbe && c1%2==0 ) { out+=c0; out+=(c1-1);  }
            else if (c0==0xc5 && 0x82<=c1 && c1 <=0x88 && c1%2==0 ) { out+=c0; out+=(c1-1);  }
            else if (c0==0xc5 && 0x8b<=c1 && c1 <=0x8f && c1%2==1 ) { out+=c0; out+=(c1-1);  }
            else if (c0==0xc5 && 0x91<=c1 && c1 <=0xb7 && c1%2==1 ) { out+=c0; out+=(c1-1);  }
            else if (c0==0xc5 && 0xba<=c1 && c1 <=0xbe && c1%2==0 ) { out+=c0; out+=(c1-1);  }
            else if (c0==0xc6 && 0x83<=c1 && c1 <=0x85 && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc6 && 0xa1<=c1 && c1 <=0xa5 && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc6 && 0x88<=c1 && c1 <=0x8c && c1%4==0 ) { out+=c0; out+=(c1-1); } 
            else if (c0==0xc6 && 0x92<=c1 && c1 <=0x99 && c1%7==6 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc6 && 0xa8<=c1 && c1 <=0xad && c1%5==3 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc6 && 0xb0<=c1 && c1 <=0xb4 && c1%4==0 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc6 && 0xb6<=c1 && c1 <=0xb9 && c1%3==2 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc6 && 0xbc<=c1 && c1 <=0xbe && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc7 && 0x90<=c1 && c1 <=0x9c && c1%2==0 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc7 && 0x8c<=c1 && c1 <=0x8e && c1%2==0 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc7 && 0x86<=c1 && c1 <=0x89 && c1%3==2 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc7 && 0x9f<=c1 && c1 <=0xaf && c1%2==1 ) { out+=c0; out+=(c1-1); } 
            else if (c0==0xc7 && 0xb3<=c1 && c1 <=0xb5 && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc7 && 0xb9<=c1 && c1 <=0xbf && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc8 && 0x81<=c1 && c1 <=0x9f && c1%2==1 ) { out+=c0; out+=(c1-1); } 
            else if (c0==0xc8 && 0xa3<=c1 && c1 <=0xb3 && c1%2==1 ) { out+=c0; out+=(c1-1); } 
            else if (c0==0xcf && 0x99<=c1 && c1 <=0xaf && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xd1 && 0xa1<=c1 && c1 <=0xbf && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xd2 && 0x8b<=c1 && c1 <=0xbf && c1%2==1 ) { out+=c0; out+=(c1-1); } 
            else if (c0==0xd3 && 0x82<=c1 && c1 <=0x8e && c1%2==0 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xd3 && 0x91<=c1 && c1 <=0xb5 && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xd3 && 0xb8<=c1 && c1 <=0xba && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xd4 && 0x81<=c1 && c1 <=0x8f && c1%2==1 ) { out+=c0; out+=(c1-1); }
            else if (c0==0xc9 && 0xa9<=c1 && c1 <=0xaf && c1%6==1 ) { out+=(c0-3); out+=(c1-0x13); }
            else if (c0==0xca && (c1==0x80 || c1==0x83 || c1==0x88)) { out+=(c0-4); out+=(c1+0x26);}
            else if (c0==0xc9 && (c1==0x96 || c1==0x97 || c1==0xa0)) { out+=(c0-3); out+=(c1-0x0d);}
            else { out+=c0; out+=c1; }
        }
        else if (c0>=224 && c0<=239)
        {
            unsigned char c1=m[i+1];
            unsigned char c2=m[i+2];
            if (0){}
            else if (c0==0xe1 && c1==0xbe  && c2==0xbe ) { out+=0xce; out+=0x99;  }
            else if (c0==0xe1 && c1==0xba  && c2==0x9b ) { out+=0xe1; out+=0xb9; out+=0xa0; }
            else if (c0==0xe1 && c1==0xbf  && c2==0x83 ) { out+=0xe1; out+=0xbf; out+=0x8c; }
            else if (c0==0xe1 && c1==0xbf  && c2==0xa5 ) { out+=0xe1; out+=0xbf; out+=0xac; }
            else if (c0==0xe1 && c1==0xb8  && 0x81<=c2 && c2<=0xbf && c2%2==1) {  out+=c0; out+=c1; out+=(c2-1); }
            else if (c0==0xe1 && c1==0xb9  && 0x81<=c2 && c2<=0xbf && c2%2==1) {  out+=c0; out+=c1; out+=(c2-1); }
            else if (c0==0xe1 && c1==0xba  && 0x81<=c2 && c2<=0x95 && c2%2==1) {  out+=c0; out+=c1; out+=(c2-1); }
            else if (c0==0xe1 && c1==0xba  && 0xa1<=c2 && c2<=0xbf && c2%2==1) {  out+=c0; out+=c1; out+=(c2-1); }
            else if (c0==0xe1 && c1==0xbb  && 0x81<=c2 && c2<=0xb9 && c2%2==1) {  out+=c0; out+=c1; out+=(c2-1); }            
            else if (c0==0xe1 && c1==0xbd  && 0x91<=c2 && c2<=0x97 && c2%2==1) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbc  && 0x80<=c2 && c2<=0x87) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbc  && 0x90<=c2 && c2<=0x95) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbc  && 0xa0<=c2 && c2<=0xa7) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbc  && 0xb0<=c2 && c2<=0xb7) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbd  && 0x80<=c2 && c2<=0x85) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbd  && 0xa0<=c2 && c2<=0xa7) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbe  && 0x80<=c2 && c2<=0x87) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbe  && 0x90<=c2 && c2<=0x97) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbe  && 0xa0<=c2 && c2<=0xa7) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbe  && 0xb0<=c2 && c2<=0xb1) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbf  && 0x90<=c2 && c2<=0x91) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && c1==0xbf  && 0xa0<=c2 && c2<=0xa1) {  out+=c0; out+=c1; out+=(c2+0x08); }
            else if (c0==0xe1 && 0xbe<=c1  && c1<=0xbf && c2==0xb3) {  out+=c0; out+=c1; out+=(c2+0x09); }
            else if (c0==0xe1 && c1==0xbd  && 0xb8<=c2 && c2<=0xb9) {  out+=c0; out+=(c1+2); out+=c2; }
            else if (c0==0xe1 && c1==0xbd  && 0xb0<=c2 && c2<=0xb1) {  out+=c0; out+=(c1+1); out+=(c2+0x0a); }
            else if (c0==0xe1 && c1==0xbd  && 0xb2<=c2 && c2<=0xb5) {  out+=c0; out+=(c1+2); out+=(c2-0x2a); }
            else if (c0==0xe1 && c1==0xbd  && 0xb6<=c2 && c2<=0xb7) {  out+=c0; out+=(c1+2); out+=(c2-0x1c); }
            else if (c0==0xe1 && c1==0xbd  && 0xba<=c2 && c2<=0xbb) {  out+=c0; out+=(c1+2); out+=(c2-0x10); }
            else if (c0==0xe1 && c1==0xbd  && 0xbc<=c2 && c2<=0xbd) {  out+=c0; out+=(c1+2); out+=(c2-0x02); }
            else { out+= c0; out+=c1; out+=c2;   }
        }
 
        if      (c0>=0   && c0<=127) { i+=0; }
        else if (c0>=192 && c0<=223) { i+=1; }
        else if (c0>=224 && c0<=239) { i+=2; }
        else if (c0>=240 && c0<=247) { i+=3; }
    }
    return out;
}
QUÉBEC
ΠΡΣΤΥΦΧΨΩΪΫ
code snippets are licensed under Creative Commons CC-By-SA 3.0 (unless otherwise specified)