l'impression d'un caractère unicode avec printf
Je suis en train d'imprimer un Ș
en passant par sa valeur décimale correspondante dans le printf. La sortie n'est rien du tout. Pourquoi ne pas mon code de travail?
#include <stdio.h>
int main()
{
printf("%lc",536);
return 0;
}
Je ne peux pas dire si c'est une dup ou pas, mais vous devrez peut-être définir les paramètres régionaux sur Linux.
aussi, essayez un fflush(NULL) après le printf. peut ou ne peut pas changer quoi que ce soit, mais au moins vous serez sûr que c'est d'être printf ed.
Vérifier la valeur de retour.
Cela dépend de votre OS, du compilateur et de l'environnement. L'appel de
Je suppose que le support de l'Unicode à partir de la bibliothèque C est un peu exagéré. Dans certains cas, vous vous en sortez simplement émettant UTF-8 sans se soucier de quoi que ce soit et laisser le terminal tri, mais habituellement, la meilleure façon est d'être conscient de l'OS et tout ce qui est entre votre programme et de l'écran et de les traiter en conséquence d'en parler à l'OS à la place de C.
aussi, essayez un fflush(NULL) après le printf. peut ou ne peut pas changer quoi que ce soit, mais au moins vous serez sûr que c'est d'être printf ed.
Vérifier la valeur de retour.
int cnt = printf("%lc", ( wint_t ) 536); printf("%d\n", cnt);
Était-il 1 ou une valeur négative (par erreur)? Un message d'erreur indique printf()
ne peut pas gérer de caractère.Cela dépend de votre OS, du compilateur et de l'environnement. L'appel de
setlocale("", LC_ALL)
au début de votre programme est une sorte de mamdatory si vous voulez tout type de support de l'Unicode à partir de la bibliothèque C de. Il peut ou peut ne pas être suffisant.Je suppose que le support de l'Unicode à partir de la bibliothèque C est un peu exagéré. Dans certains cas, vous vous en sortez simplement émettant UTF-8 sans se soucier de quoi que ce soit et laisser le terminal tri, mais habituellement, la meilleure façon est d'être conscient de l'OS et tout ce qui est entre votre programme et de l'écran et de les traiter en conséquence d'en parler à l'OS à la place de C.
OriginalL'auteur Mike | 2017-01-22
Vous devez vous connecter pour publier un commentaire.
La
l
spécificateur de longueur appliqué à unc
champ descripteur indique que l'argument est de typewint_t
(déclarée danswchar.h
). Dans votre code, l'argument est de typeint
, qui pourrait ou pourrait ne pas être la même. Si en effet, elle n'est pas la même, alors le comportement est indéfini. Vous pouvez obtenir unwint_t
par casting ...; c'est le plus sûr et le plus portable de façon à exprimer une
wint_t
constante.En outre, il est possible que la question de jeux de caractères ici. C'est une question de l'environnement dans lequel votre programme s'exécute, pas tellement le programme lui-même. Il est concevable que votre programme en effet sorties du personnage en question, dans certains encodage, mais le terminal dans lequel vous êtes en cours d'exécution ne sais pas comment le gérer, ou peut-être ne pas avoir un glyphe. Vous devriez être en mesure de tester pour en redirigeant la sortie vers un fichier, et ensuite examiner le contenu du fichier (peut-être à un fichier binaire).
~
donc il n'y a pas autre chose funky passe..Peut-être que votre implémentation C est vieux ou buggy. Lequel utilisez-vous?
OriginalL'auteur John Bollinger
Sur macOS Sierra 10.12.2 avec GCC 6.3.0, si j'exécute ce programme (compilé à partir de
mb37.c
enmb37
):la sortie est:
Qui, je crois, est la sortie désirée. Si le
setlocale()
ligne est supprimée, alors pas de sortie à tous les est produit, même pas un saut de ligne. La locale utilisée esten_US.UTF-8
; mon terminal gère l'UTF-8. Le nom de la langue est trouvé par la capture et l'impression de la valeur de retour desetlocale()
— régulier de la chaîne.La
wint_t
plâtre semi-optionnel; il se trouve qu'une version 64 bits de compilation sans la fonte ou le<wchar.h>
en-tête également produit le même résultat, mais il y a un peu une coïncidence quewint_t
est le même queint
. Qui prend un peu de suivi;wint_t
est défini comme__darwin_wint_t
qui est définie comme__darwin_ct_rune_t
qui est définie commeint
. Pour être de façon portable correct, le cast est nécessaire. Sur certains systèmes, il peut ne pas être nécessaire (et macOS Sierra est un système de ce type).Le saut de ligne dans le
printf()
n'est pas 100% nécessaire, mais si il est omis, l'invite suivante suit immédiatement le U+0218 LETTRE LATINE majuscule S par des VIRGULES ci-DESSOUS. Il est préférable de s'assurer que la sortie se termine par un saut de ligne.OriginalL'auteur Jonathan Leffler
Il n'est pas nécessaire en C qu'une ligne sans caractère de saut de ligne à la fin sera imprimé. Essayez "%lc\n".
Je pense que tu te trompes, @gnasher729. Si
stdout
est la ligne de tampon (par défaut) ou avec tampon puis la sortie peut ne pas apparaître , mais il apparaît lorsque le fichier est vidé, ce qui arrive quand il est fermé, ce qui se produit lorsque le programme appelle laexit()
fonction ou des retours demain()
, comme l'OP du programme, en effet, n'.Pouvez-vous prouver que
stdout
est fermé lorsque le programme s'arrête? Je n'ai rien trouvé dans la section de 7,19 de la norme, et je me souviens que inachevé lignes n'ont pas à être écrite.7.22.4.4 La
exit
fonction: ¶4 Ensuite, tous les cours d'eau avec non écrites données mises en mémoire tampon sont vidées, tous les volets sont fermés, et tous les fichiers créés par la fonction tmpfile sont supprimés. et §5.1.2.2.3 de fin de Programme: ¶1 Si le type de retour de lamain
fonction est un type compatible avecint
, un retour de l'appel initial à lamain
fonction est équivalente à l'appel de laexit
de la fonction avec la valeur retournée par lamain
fonction comme argument;.... (C11 — aka la norme ISO/IEC 9899:2011.)aussi 7.21.3/5: "Si la principale fonction de retour à son origine de l'appelant, ou si la sortie de la fonction est appelée, tous les fichiers ouverts sont fermés (donc tous les flux de sortie sont vidées) avant la fin du programme." Donc oui, je peux prouver que la norme l'exige (mais ce n'est pas que le programme est conforme à la norme à cet égard).
OriginalL'auteur gnasher729