Mon programme C est collé ci-dessous. À bash, le programme Imprimer "Char est", Î © © n'est pas imprimé. Mes paramètres régionaux sont tous EN_US.UTF8.
#include <stdio.h> #include <wchar.h> #include <stdlib.h> int main() { int r; wchar_t myChar1 = L'Ω'; r = wprintf(L"char is %c\n", myChar1); }
3 Réponses :
Utilisez {GLIB, LIBICONV, ICU} pour le convertir en UTF-8 avant de sortir. p>
Merci. Puis-je le faire en n'utilisant pas ces libs?
C'était assez intéressant. Apparemment, le compilateur traduit l'oméga de UTF-8 à UNICODE, mais la LIBC est en quelque sorte mortes.
Tout d'abord: le spécificateur Deuxièmement, si vous exécutez votre code comme celui-ci, le paramètre local est défini sur % c code> -Format attend un
char code> (Même dans le WPRINTF -Version), vous devez donc spécifier
% lc < / code> (et donc
% ls code> pour chaînes). P>
c code> (il n'est pas automatiquement tiré de l'environnement). Vous devez appeler
SetLocale code>
avec un vide String pour prendre les paramètres régionaux de l'environnement, le libc est donc heureux à nouveau. p>
En fait, c'est comme prévu. Libc ne gâche pas, cela suit simplement la norme.
Merci, mais pouvez-vous donner quelques détails? Que voulez-vous dire que les paramètres régionaux sont définis sur 'c'?
Alternativement à la réponse suggérant la fixation de libc, vous pouvez le faire:
#include <stdio.h> #include <wchar.h> #include <stdlib.h> // NOTE: *NOT* thread safe, not re-entrant const char* unicode_to_utf8(wchar_t c) { static unsigned char b_static[5]; unsigned char* b = b_static; if (c<(1<<7))// 7 bit Unicode encoded as plain ascii { *b++ = (unsigned char)(c); } else if (c<(1<<11))// 11 bit Unicode encoded in 2 UTF-8 bytes { *b++ = (unsigned char)((c>>6)|0xC0); *b++ = (unsigned char)((c&0x3F)|0x80); } else if (c<(1<<16))// 16 bit Unicode encoded in 3 UTF-8 bytes { *b++ = (unsigned char)(((c>>12))|0xE0); *b++ = (unsigned char)(((c>>6)&0x3F)|0x80); *b++ = (unsigned char)((c&0x3F)|0x80); } else if (c<(1<<21))// 21 bit Unicode encoded in 4 UTF-8 bytes { *b++ = (unsigned char)(((c>>18))|0xF0); *b++ = (unsigned char)(((c>>12)&0x3F)|0x80); *b++ = (unsigned char)(((c>>6)&0x3F)|0x80); *b++ = (unsigned char)((c&0x3F)|0x80); } *b = '\0'; return b_static; } int main() { int r; wchar_t myChar1 = L'Ω'; r = printf("char is %s\n", unicode_to_utf8(myChar1)); return 0; }
Cette réponse est stupide; Le seul point d'utilisation wchar_t code> pour commencer est que vous pouvez prendre en charge théoriquement des codages de sortie différents dans différents groupes locaux. Si vous souhaitez que le code dur UTF-8, utilisez simplement
char * mychar1 = "Ω"; code>, puis
printf code> avec
% s code> .. .
Je traite ma réponse comme une solution de contournement ou éventuellement une solution dans des cas d'utilisation plus limitée. J'aime la réponse qui a été choisie comme une solution alors aucun argument ici. À votre santé.