c++, de cout et de l'UTF-8
Espérons le, une question simple: cout
semble mourir lors de la manipulation de chaînes de caractères qui se termine avec un multi-octets UTF-8 char, suis-je en train de faire quelque chose de mal? C'est avec GCC (Mingw) sur Win7 x64.
**Edit Désolé si je n'ai pas été assez clair, je ne suis pas préoccupé par les glyphes manquants ou comment les octets sont interprétés, mais simplement qu'ils ne sont pas en montrant à tout juste après l'appel à cout << s4
(manque le BAR). Toute cout
s après le premier affichage aucun texte!
#include <cstdio>
#include <iostream>
#include <string>
int main() {
std::string s1("abc");
std::string s2("…"); //… = 0xE2 80 A6
std::string s3("…abc");
std::string s4("abc…");
//In C
fwrite(s1.c_str(), s1.size(), 1, stdout);
printf(" FOO ");
fwrite(s2.c_str(), s2.size(), 1, stdout);
printf(" BAR ");
fwrite(s3.c_str(), s3.size(), 1, stdout);
printf(" FOO ");
fwrite(s4.c_str(), s4.size(), 1, stdout);
printf(" BAR\n\n");
//C++
std::cout << s1 << " FOO " << s2 << " BAR " << s3 << " FOO " << s4 << " BAR ";
}
//results:
//abc FOO ��� BAR ���abc FOO abc… BAR
//abc FOO ��� BAR ���abc FOO abc…
Où en êtes-vous de l'exécution de votre programme? L'invite de commande Windows n'aime pas vraiment Unicode beaucoup, donc, même si votre programme est peut-texte de sortie, la console ne sait pas quoi faire avec elle.
La console Windows sous-système n'a pas de vrais problèmes.
Fonctionne pour moi sous Ubuntu/gnome-terminal/GCC. Je soupçonne que l'obtention de ce droit exige que les deux C++ exactitude et prendre les spécificités de la plate-forme en ligne de compte.
Oh c'est vrai, je devrais avoir été plus précis.
Rediriger la sortie dans un fichier et ouvrez ce fichier dans le bloc-notes. Ce qui se passe?
La console Windows sous-système n'a pas de vrais problèmes.
WriteConsoleW
fonctionne raisonnablement bien, étant donné polices de caractères. Windows n'aime pas l'UTF-8, mais, ce qui signifie que WriteConsoleA
va jusqu'à s'étouffer ici.Fonctionne pour moi sous Ubuntu/gnome-terminal/GCC. Je soupçonne que l'obtention de ce droit exige que les deux C++ exactitude et prendre les spécificités de la plate-forme en ligne de compte.
Oh c'est vrai, je devrais avoir été plus précis.
Rediriger la sortie dans un fichier et ouvrez ce fichier dans le bloc-notes. Ce qui se passe?
OriginalL'auteur user657267 | 2011-08-05
Vous devez vous connecter pour publier un commentaire.
Ce n'est vraiment pas une surprise. À moins que votre terminal est mis en UTF-8 codage, comment sait-elle que
s2
n'est pas censé être "(lettre minuscule latine a avec accent circonflexe) ( € ) (Pipe)",en supposant que votre terminal est mis en ISO-8859-1 selon http://www.ascii-code.com/
Par le chemin, cout n'est pas "mourir" comme il est clairement continue de produire de la sortie après votre chaîne de test.
std::cout
seulement fait l'écho d'un flux d'octets pour le monde extérieur. La façon dont ils sont interprétés est entre vous et le programme qui va lire ces octets.Yep, cout sorties de rien, mais si vous utilisez printf ensuite, vous obtenez ce que vous attendez (sauf si vous n'avez pas utilisé la bonne police pour la console, et fait
chcp 65001
OriginalL'auteur koan
Si vous voulez que votre programme à utiliser vos paramètres régionaux en cours, appel
setlocale(LC_ALL, "")
que la première chose dans votre programme. Sinon, le programme est locale estC
et ce qu'elle fera pour les caractères non-ASCII n'est pas connaissable par nous, simples humains.setlocale(LC_ALL, "")
et de fairechcp 65001
était l'astuce pour l'Unicode dans la consoleOriginalL'auteur n.m.
La console Windows ne gère pas les non-locale-page de codes de caractères par défaut.
Vous aurez besoin pour vous assurer que vous avez un compatibles Unicode jeu de polices dans la fenêtre de la console, et que la page de codes est définie à l'UTF-8 par l'intermédiaire d'un appel à
chcp
. Ce n'est pas une garantie de succès.Notez que le wcout ne change rien si la console ne peut pas afficher les caractères de fantaisie, parce que la police est bâclé.
Sur tous les distributions Linux, la console est définie à l'UTF-8 et cela devrait fonctionner hors de la boîte.
OriginalL'auteur rubenvb
Comme d'autres l'ont souligné,
std::cout
est agnostique sur ce sujet, au moins dans"C"
locale (par défaut). D'autre part, votre fenêtre de la console doit être configuré pour afficher l'UTF-8: page de code 65001. Essayez d'appelerchcp 65001
avant l'exécution de votre programme. (Ce qui a fonctionné pour moi dans le passé.)OriginalL'auteur James Kanze