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

Signaler
Messages postés
4
Date d'inscription
samedi 10 octobre 2009
Statut
Membre
Dernière intervention
23 avril 2014
-
Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
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

Messages postés
3833
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
122
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.