Conversion des minuscules accentuées en minuscules sans accent : impossible ?

ungars2 Messages postés 4 Date d'inscription samedi 10 octobre 2009 Statut Membre Dernière intervention 23 avril 2014 - 7 déc. 2009 à 21:06
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 7 déc. 2009 à 22:12
Bonjour,

voici les messages d'erreurs de GCC pour ce code (c'est juste un exemple) :

Line Location main.c:34: warning: multi-character character constant
Line Location main.c:34: warning: comparison is always false due to limited range of data type

Je sous mac os x : le problème est le même avec NetBeans ou Xcode...même si ce second permet de changer d'encodage de texte, ce que je n'ai pas trouvé pour le premier.

Les minuscules accentuées font tousser le compilateur, mais un code objet est produit. Mais qui ne donne rien à l'exécution : le texte reste comment il est : "èéà" reste éèà"... Je crois comprendre que GCC ne prend pas en compte le fait que le source soit en UTF-8. Et même çà ne donne rien de mieux :

gcc MajMin.c -o MajMin -fexec-charset=UTF-8 -finput-charset=UTF-8
gcc MajMin.c -o MajMin -fexec-charset=ISO-8859-1 -finput-charset=ISO-8859-1

J'ai beau avec TexWrangler sauvergarder en ISO-8859-1 ou en UTF-8 : rien à faire !

#include <stdio.h>
#define N 20

void MajToMin(char chaine[])
{
int i=0;
while(chaine[i]!='\0')
{
if(chaine[i]>=65 && chaine[i]<=90)
{
chaine[i]=chaine[i] + 32;
}
i++;
}
}

int STRLEN(char chaine[])
{
int i=0;
while (chaine[i] !='\0')
{
i++;
}
return i;
}


void Accent(char chaine[])
{
int x=0;
//int longueur=(STRLEN(chaine)-1);
while(chaine[x]!='\0')
{
if((chaine[x]=='é') || (chaine[x]=='è') || (chaine[x]=='ê') || (chaine[x]=='ë'))
{
chaine[x] = 'e';
}
else if((chaine[x] =='à') || (chaine[x] =='â') || (chaine[x] =='ä'))
{
chaine[x] ='a';
}
else if((chaine[x] =='ù') || (chaine[x] =='ü') || (chaine[x] =='û'))
{
chaine[x] ='u';
}
else if((chaine[x] =='î') || (chaine[x] =='í') || (chaine[x] =='ì') || (chaine[x] =='ï'))
{
chaine[x] ='i';
}

x++;
}



/* while(chaine[x]!='\0')
{
if(chaine[x]<0)
{
chaine[x]=chaine[x]+256;
}
x++;
}*/

}

int main (void)
{
char mot[N];
printf("Entrez un mot : \n ");
scanf("%s", mot);
MajToMin(mot);
printf("sans majuscule: %s \n", mot);
Accent(mot);
printf("sans majuscule ni accent: %s \n", mot);
return 0;
}

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
7 déc. 2009 à 22:12
Ce n'est pas un problème d'encoding UTF-8 de tes fichiers.

Un caractère qui n'est pas dans la table ASCII standard n'est pas codé pareil. Il tiendra sur plusieurs char (d'où l'erreur de gcc te disant warning: multi-character character constant => la lettre accentuée étant codé sur plus d'un char, gcc pense que tu lui donne une chaîne de caractère dans un guillement simple), ou sur un autre type de donné (par exemple wchar_t).

Si tu veux vraiment gérer des caractères spéciaux, regarde du côté des wide characters (caractères étendus).
http://en.wikipedia.org/wiki/Wide_character

Tu as d'ailleurs des méthodes spécifiques dans wchar.h.
0
Rejoignez-nous