MinGW + GCC sous Windows et caractères UTF-8

J’ai un problème avec le compilateur GCC et Windows CMD car je ne vois pas correctement les caractères UTF-8. J’ai le code suivant:

#include  #include  int main() { char caractere; int inteiro; float Float; double Double; printf("Tipo de Dados\tNúmero de Bytes\tEndereço\n"); printf("Caractere\t%d bytes \t em %d\n", sizeof(caractere), &caractere); printf("Inteiro\t%d bytes \t em %d\n", sizeof(inteiro), &inteiro); printf("Float\t%d bytes \t\t em %d\n", sizeof(Float), &Float); printf("Double\t%d bytes \t em %d\n", sizeof(Double), &Double); printf("Caractere: %d bytes \t em %p\n", sizeof(caractere), &caractere); printf("Inteiro: %d bytes \t em %p\n", sizeof(inteiro), &inteiro); printf("Float: %d bytes \t\t em %p\n", sizeof(Float), &Float); printf("Double: %d bytes \t em %p\n", sizeof(Double), &Double); return 0; } 

Et puis je lance la commande suivante:

 gcc pointers01.c -o pointers 

Je n’ai aucune erreur de compilation. Mais quand j’exécute le fichier produit (.exe), il ne montre pas les caractères UTF-8:

 Tipo de Dados Número de Bytes Endereço Caractere 1 bytes em 2686751 Inteiro 4 bytes em 2686744 Float 4 bytes em 2686740 Double 8 bytes em 2686728 Caractere: 1 bytes em 0028FF1F Inteiro: 4 bytes em 0028FF18 Float: 4 bytes em 0028FF14 Double: 8 bytes em 0028FF08 

Comment faire pour résoudre ce problème? Je vous remercie.

Malheureusement, la console Windows a un support très limité et bogué pour UTF-8.

Que peut-on faire: Définissez la page de code sur 65001 et utilisez l’une des fonts qui la supportent, par exemple. “Console Lucida”. La page de code peut être définie par la commande chcp ou, en C / C ++, par la fonction SetConsoleOutputCP ; La police est définie avec SetCurrentConsoleFontEx .

Cependant, il existe des problèmes majeurs (et mineurs). Mineure d’abord:

a) Ces fonctions sont valables pour une session, c.-à-d. Si vous relancez le programme plus tard, vous devez le configurer à nouveau. Il est théoriquement possible de le rendre par défaut, mais cela n’est pas recommandé car cela affectera tous les programmes de la console et leur présentera les problèmes ci-dessous, même s’ils ne font rien avec les pages de code et ne sont pas écrits pour atténuer les problèmes.

b) Si la console n’est pas ouverte par le programme, mais que vous la lancez depuis une console existante, cela affectera tout ce qui se passe après la fermeture de la console. Donc, vous devez le ramener à la valeur par défaut avant que votre propre programme se termine.

c) Certaines fonctions utilisables pour les entrées / sorties de la console ne fonctionneront pas correctement avec CP65001.
(c’est la chose la plus grave)

Contrairement à l’ensemble de Windows UTF16, il traite partiellement UTF8 comme n’importe quel jeu de caractères sur 1 octet , et effectue des opérations étranges qui remplissent le standard avec des jeux de caractères d’1 octets, mais sont implémentées différemment.

Par exemple, fread doit renvoyer le nombre d’octets lus (s’il est appelé avec la taille 1), mais dans l’implémentation de Microsoft, il renvoie le nombre de caractères (UTF16 est une exception, mais pas UTF8). Avec n’importe quelle page de code normale, cela fonctionnera car 1char = 1 octet, mais pas avec UTF8 … valeur de retour incorrecte => données erronées traitées

Un autre exemple, fflush peut se bloquer (au moins est signalé à, pas vérifié). etc.
Et cela n’affecte pas seulement les fonctions standard C, mais aussi les appels directs Winapi.

d) À la suite de c), tous les fichiers de commandes avec des caractères UTF-8 (à l’exception de la plage ASCII normale) ne fonctionneront pas correctement, du moins dans certaines versions de Windows (ne vérifient pas chacun, mais il est très probable que Win10 a toujours ce bogue. MS ne montre aucune intention de le réparer de sitôt.)

Quelques lectures supplémentaires pour c et d: https://social.msdn.microsoft.com/Forums/vstudio/en-US/e4b91f49-6f60-4ffe-887a-e18e39250905/possible-bugs-in-writefile-and-crt- unicode-issues? forum = vcgeneral

Je sauvegarde habituellement les fichiers source sous DOS (CP437) avec Sublime Text et ça marche (du moins pour les petits programmes).