jeu
27
mar '
08
Une routine C du type UTF-8 vers ASCII
Par Neces, jeudi 27 mars 2008 à 21:19 :: Win Développement :: #368 :: rss :: 380 lectures
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)










Wikio
Commentaires
Aucun commentaire pour le moment.
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.