Il y a deux choses différentes qui se passent ici dont il faut être conscient :
- En le fichier C source lui-même peut ne pas être en mesure de contenir ce caractère correctement.
- En
char
dans la sémantique du programme actuel ne supporte pas non plus ce caractère.
Pour ce qui est de la première question, cela dépend de votre plate-forme (etc.), mais il est préférable d'être conservateur avec les sources C, ce qui signifie s'en tenir aux caractères ASCII uniquement dans le fichier de code. Cela signifie, par exemple, dans les commentaires ainsi que dans le code significatif. Cela dit, de nombreuses plateformes autorisent et prennent en charge les caractères Unicode dans les fichiers source.
En ce qui concerne le second, un char
est démodé pour contenir des caractères, et est limité à un octet, ce qui signifie que caractères unicode arbitraires avec des valeurs supérieures à 0xFF ne rentrent tout simplement pas à l'intérieur. Je suppose que certains caractères non-ASCII s'insèrent d'une manière dépendante de la plate-forme (pages de code Windows ?) au-dessus de la valeur 0x7F, mais dans ce cas, je traiterais ceci comme une chaîne de caractères, en utilisant une séquence d'échappement unicode pour ce caractère : "\u221A"
.
char * sqrt = "\u221A";
if (strcmp(sqrt, "\u221A") == 0) {
printf("Working");
} else {
printf("Not working");
}
Il faut savoir que les chaînes de caractères C ( char*
) ne sont pas vraiment conçus pour les caractères non ASCII non plus, donc dans ce cas, vous finissez par intégrer la représentation codée UTF8 du caractère (qui fait trois octets) à l'intérieur de la chaîne char. Cela fonctionne, préserve la valeur et la comparaison fonctionne, mais si vous avez l'intention de travailler avec l'unicode de manière plus générale...
Si votre plate-forme prend en charge les "caractères larges" ( wchar_t
o unichar
ou similaire) qui peuvent contenir des caractères Unicode, alors vous pouvez utiliser ces types pour contenir ce caractère, et faire des comparaisons d'égalité directe comme vous le faisiez :
wchar_t sqrt = L'\u221A';
if (sqrt == L'\u221A') {
...
(Pour votre information, sachez que ces types de caractères larges peuvent ne pas être assez larges pour les points de code Unicode arbitraires de votre plate-forme. Ainsi, ils peuvent fonctionner pour le caractère racine carrée, mais pas, disons, pour un emoji).
Enfin, dans un souci d'exhaustivité, j'ai l'honneur d'admettre qu'avec un environnement de développement/une chaîne d'outils contemporains, il n'est pas possible d'obtenir des résultats satisfaisants. et vous pourriez probablement vous en sortir en utilisant le caractère explicite dans un littéral widechar comme ceci :
wchar_t sqrt = L'';
if (sqrt == L'') {
....
Mais je suis vieux jeu, c'est un peu sommaire et je ne le recommande pas.)