Vu ta remarque, une petite explication s'impose.
Une donnée brute récupérée dans un unsigned char vaut par exemple :
10001111 (soit 143 en décimale).
Maintenant si tu le castes en char (signé) la valeur binaire ne change pas ! C'est juste l'interprétation qui change, ça vaut -15.
Quand tu écris cette valeur dans ton printf et que tu précises que tu veux afficher cette valeur sous forme de caractère avec %c ou %s ('et non sous forme décimal avec %d par exemple), la responsabilité d'afficher correctement cette valeur incombe à la sortie standard, soit dans notre cas la console.
Le programme C envoie ainsi la chaine de caractère (ou le caractère) sous forme de valeur binaire et la console affiche les caractères en fonction de la table de conversion "valeur binaire" vers "caractère affichable" sur laquelle elle est réglée, c'est le charset, soit par exemple UTF8 ou ISO-8859-15.
Exemple :
Compilons le programme.Code:
1
2
3
4
5
6
7 #include <stdio.h> int main() { char c = 164; printf("%c\n", c); }
Ensuite deux essais, un en console avec encodage ISO-8859-1 et l'autre en ISO-8859-15, sans recompiler on a deux résultats différent (un petit carré et le signe €) ce qui prouve que c'est bien la console qui gère ça.
Le problème c'est que ces tables sont limitées à 256 caractères (vu que chaque caractère est représenté sur 1 octet) alors il y a plein d'extension qui redéfinisse à leur sauce la deuxième moitié, soit l'extension ASCII (comme les deux d'avant).
Mais maintenant, il y a l'UTF-8, c'est un format qui permet de représenter quasi tous les caractères du monde, un format universel qui satisfait presque tout le monde. On évite ainsi les problèmes que tu as ! Donc le mieux c'est de gérer ce format là. Tu comprends bien que pour représenter tout les caractères du monde, il faut bien plus que 256 caractères et donc il faut un codage sur plusieurs octets !
Pour UTF8 si :
Les trois premiers bits sont à "110" : ça veut dire qu'il y a un deuxième octet qui suit. Sinon c'est un simple code ASCII (les 128 premiers caractères de la table ASCII de base).
Si les 4 premiers bits sont à "1110" : il y a trois octets qui suivent.
Et ainsi de suite: voir wikipédia.
J'espère que ça t'as un peu éclairé.