Necesware.info

jeu
27
mar ' 08

Une routine C du type UTF-8 vers ASCII


Bon, d'accord elle est quick and dirty, mais elle marche super!

J'ai cherché partout et longtemps sans trouver...
J'ai juste mis la main sur le tableau UTF-8/ASCII et j'ai fait le reste!

typedef struct {
   char ascii;
   int utf8;
} TabConv;
TabConv TConvC2[] = {
{'¡', 0xa1},
{'¢', 0xa2},
{'£', 0xa3},
{'¤', 0xa4},
{'¥', 0xa5},
{'¦', 0xa6},
{'§', 0xa7},
{'¨', 0xa8},
{'©', 0xa9},
{'ª', 0xaa},
{'«', 0xab},
{'¬', 0xac},
{'­-', 0xad},
{'®', 0xae},
{'¯', 0xaf},
{'°', 0xb0},
{'±', 0xb1},
{'²', 0xb2},
{'³', 0xb3},
{'´', 0xb4},
{'µ', 0xb5},
{'¶', 0xb6},
{'·', 0xb7},
{'¸', 0xb8},
{'¹', 0xb9},
{'º', 0xba},
{'»', 0xbb},
{'¼', 0xbc},
{'½', 0xbd},
{'¾', 0xbe},
{'¿', 0xbf},
{'?', 0xff}
};
TabConv TConvC3[] = {
{'À', 0x80},
{'Á', 0x81},
{'Â', 0x82},
{'Ã', 0x83},
{'Ä', 0x84},
{'Å', 0x85},
{'Æ', 0x86},
{'Ç', 0x87},
{'È', 0x88},
{'É', 0x89},
{'Ê', 0x8a},
{'Ë', 0x8b},
{'Ì', 0x8c},
{'Í', 0x8d},
{'Î', 0x8e},
{'Ï', 0x8f},
{'Ð', 0x90},
{'Ñ', 0x91},
{'Ò', 0x92},
{'Ó', 0x93},
{'Ô', 0x94},
{'Õ', 0x95},
{'Ö', 0x96},
{'×', 0x97},
{'Ø', 0x98},
{'Ù', 0x99},
{'Ú', 0x9a},
{'Û', 0x9b},
{'Ü', 0x9c},
{'Ý', 0x9d},
{'Þ', 0x9e},
{'ß', 0x9f},
{'à', 0xa0},
{'á', 0xa1},
{'â', 0xa2},
{'ã', 0xa3},
{'ä', 0xa4},
{'å', 0xa5},
{'æ', 0xa6},
{'ç', 0xa7},
{'è', 0xa8},
{'é', 0xa9},
{'ê', 0xaa},
{'ë', 0xab},
{'ì', 0xac},
{'í', 0xad},
{'î', 0xae},
{'ï', 0xaf},
{'ð', 0xb0},
{'ñ', 0xb1},
{'ò', 0xb2},
{'ó', 0xb3},
{'ô', 0xb4},
{'õ', 0xb5},
{'ö', 0xb6},
{'÷', 0xb7},
{'ø', 0xb8},
{'ù', 0xb9},
{'ú', 0xba},
{'û', 0xbb},
{'ü', 0xbc},
{'ý', 0xbd},
{'þ', 0xbe},
{'ÿ', 0xbf},
{'?', 0xff}
};

char iConv( char c, int d )
{
    int i=0;
    switch (c) {
    case -61 :  // C3
        while (TConvC3[i].utf8<d) i++;
        return TConvC3[i].ascii;
    case -62 :  // C2
        while (TConvC2[i].utf8<d) i++;
        return TConvC2[i].ascii;
    default:
        return '?';
    }
}

appellée comme suit :

  
   char *bloc;  // source
   char *ptr;  // destination
         char c = *(bloc)++;
         // UTF-8 vers ASCII
         if (c == -61) {
             int d = 256 + (*(bloc)++);
             c = iConv( c, d );
         }
         *ptr++ = c;

Ne faites pas un copier/coller, il y a des caractères qui manquent (dû à Dotclear, je pense)


Commentaires

Aucun commentaire pour le moment.

Ajouter un commentaire

Les commentaires pour ce billet sont fermés.


Syndication

Contacts