6 de jan. de 2010

Conversor UTF-8 para CHAR, em C

Depois de muito procurar na intenert e de tentativas anteriores frustadas, consegui um conversor de UTF8 para CHAR (ASCII) do C. A idéia era transformar "ÁÀÃÂ" para "AAAA".

Depois de encontrar um site que especifica quais os códigos do UTF8 (http://titus.uni-frankfurt.de/unicode/inx/titu0000.htm) fiz uma função que faz a conversão que eu me referi:

void volta_uma_casa(char *s,int pos){
    int i;
    int tam=strlen(s);
    for(i=pos;i<tam;i++){
        s[i]=s[i+1];
    }
}

void utf8_para_ascii(char *s){
    //inspirado em: http://titus.uni-frankfurt.de/unicode/inx/titu0000.htm
    /* string de teste
"!    \"    #    $    %    &    '    (    )    *    +    ,    -    .    /    0    1    2    3    4    5    6    7    8    9    :    ;    <    =    >    ?    @    A    B    C    D    E    F    G    H    I    J    K    L    M    N    O    P    Q    R    S    T    U    V    W    X    Y    Z    [    \\    ]    ^    _    `    a    b    c    d    e    f    g    h    i    j    k    l    m    n    o    p    q    r    s    t    u    v    w    x    y    z    {    |    }    ~             ¡    ¢    £    ¤    ¥    ¦    §    ¨    ©    ª    «    ¬    ­    ®    ¯    °    ±    ²    ³    ´    µ    ¶    ·    ¸    ¹    º    »    ¼    ½    ¾    ¿    À    Á        à   Ä    Å    Æ    Ç    È    É    Ê    Ë    Ì    Í    Π   Ï    Р   Ñ    Ò    Ó    Ô    Õ    Ö    ×    Ø    Ù    Ú    Û    Ü    Ý    Þ    ß    à    á    â    ã    ä    å    æ    ç    è    é    ê    ë    ì    í    î    ï    ð    ñ    ò    ó    ô    õ    ö    ÷    ø    ù    ú    û    ü    ý    þ    ÿ"   
    */
    unsigned char c,c2;
    int i;
    int tam=strlen(s);
    for(i=0;(i<tam)&&(s[i]!=0);i++){
        c=(unsigned char)s[i];
        //printf("%d: c=%c=%d c2=%c=%d\n",i,c,(unsigned char)c,c2,(unsigned char)c2);
        c2=(unsigned char)s[i+1];
        if(c==194){
            //caracteres estranhos!!!: limpa os dois caracteres
            volta_uma_casa(s,i);
            volta_uma_casa(s,i);
        }else{
            if(c==195){//algum caracter que interessa
                if((c2>=128)&&(c2<=128+6)){//À    Á        à   Ä    Å    Æ
                    s[i]='A';
                    volta_uma_casa(s,i+1);
                }else
                if(c2==128+7){//Ç
                    s[i]='C';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=128+8)&&(c2<=128+11)){//È    É    Ê    Ë
                    s[i]='E';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=128+12)&&(c2<=128+15)){//Ì    Í    Π   Ï
                    s[i]='I';
                    volta_uma_casa(s,i+1);
                }else
                if(c2==144+1){//Ñ
                    s[i]='N';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=144+2)&&(c2<=144+6)){//Ò    Ó    Ô    Õ    Ö
                    s[i]='O';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=144+9)&&(c2<=144+12)){//Ù    Ú    Û    Ü
                    s[i]='U';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=160)&&(c2<=128+6)){//à    á    â    ã    ä    å    æ
                    s[i]='a';
                    volta_uma_casa(s,i+1);
                }else
                if(c2==160+7){//ç
                    s[i]='c';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=160+8)&&(c2<=160+11)){//è    é    ê    ë
                    s[i]='e';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=160+12)&&(c2<=160+15)){//ì    í    î    ï
                    s[i]='i';
                    volta_uma_casa(s,i+1);
                }else
                if(c2==176+1){//ñ
                    s[i]='n';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=176+2)&&(c2<=176+6)){//ò    ó    ô    õ    ö
                    s[i]='o';
                    volta_uma_casa(s,i+1);
                }else
                if((c2>=176+9)&&(c2<=176+12)){//ù    ú    û    ü
                    s[i]='U';
                    volta_uma_casa(s,i+1);
                }else
                {
                    //caracteres estranhos!!!: limpa os dois caracteres
                    volta_uma_casa(s,i);
                    volta_uma_casa(s,i);
                }
            }
        }
    }
}


Ficou um pouco extensa, mas funciona bem.