2013-05-06 3 views
0

I ont le code pour imprimer un utf-8 char console de fenêtres:sortie utf-8 à la console

SetConsoleOutputCP(65001); 
freopen(NULL, "w,ccs=UTF-8", stdout); 

wchar_t u16 = 0x00A9; 
unsigned char utf8_b[] = {0xc2, 0xa9, 0x0}; //same as using WideCharToMultibyte for u16 
printf("%s", utf8_b); //(1) 
wprintf(L"%c", u16); //(2) 

(1) produit une sortie correcte qui est '©', tandis que (2) de sortie est le caractère de remplacement U + FFFD. J'ai essayé de rediriger stdout (2) vers un fichier pour voir s'il y a un problème avec la conversion d'encodage mais il produit les mêmes séquences d'octets que utf8_b []. Est-ce que quelqu'un peut m'expliquer pourquoi est-ce? Est-ce un problème de Windows?

btw, ma police de console est déjà définie sur Consolas.

edit: Je commente (1) avant d'utiliser (2), donc je pense que ce n'est pas lié à l'orientation du flux ici. J'ai lu quelque part que certains bogues d'implémentation dans la page de codes Windows 65001 peuvent affecter les E/S standard. Quelqu'un peut-il confirmer cela pour moi?

+0

Qu'en est-il de ['putwchar'] (http://www.cplusplus.com/reference/cwchar/putwchar/)? – Kninnug

+0

@Kninnug même résultat que (2) =. = – hatsuyuki

+0

Cela ne me reproche pas du tout. Quelle version de VS est-ce? –

Répondre

0

La combinaison d'une sortie large et orientée octets sur le même flux FILE appelle un comportement indéfini. Vous devriez plutôt essayer d'utiliser printf("%lc", u16); ou d'éliminer toute sortie orientée octet.