Comment lire une codé en UTF-8 fichier contenant des caractères Chinois et de sortie correctement sur la console?
Je suis en train d'écrire un crawler web pour chercher un peu de Chinois des fichiers web. Extraites des fichiers sont encodés en utf-8. Et j'ai besoin de lire ces fichier pour faire certains analyser, telles que l'extraction de l'Url et des Caractères Chinois. Mais j'ai constaté que lorsque j'ai lu le fichier dans un std::string variable et de sortie dans la console, les caractères Chinois sont devenus des caractères illisibles. J'ai appliqué le boost::regex dans le std::string variable et permet d'extraire toutes les Url, mais les caractères Chinois.
Comment puis-je résout ces problèmes?
P. S. Mon RPC, les fichiers sont encodés en ANSI par défaut, le système d'exploitation est Win8 en Langue Chinoise;
Probablement la console est la faute de. Essayez
>
'ing dans un fichier. Si elle s'avère être en UTF-8 valide avec des caractères Chinois, alors votre programme fonctionne bien et c'est un Windows question. (Bien sûr, vous pouvez toujours besoin de changer votre programme de travail autour des Fenêtres, mais vous saurez à qui la faute.)Oui, lorsque je redirige le std::string variable dans un autre fichier, le contenu est toujours UTF-8 valide avec Chiese caractères. Ma console est la page de code est
"936(ANSI/OEM - 简体中文 GBK)"
.OriginalL'auteur Bruce Yang | 2013-11-25
Vous devez vous connecter pour publier un commentaire.
Ce code peut aider (il a été compilé avec VC++ 2010). Je l'ai testé avec un fichier UTF-8 contenant des caractères non-latins et il semble fonctionner, mais je ne sais pas si cela fonctionnera très bien avec les caractères Chinois. Consultez les liens suivants pour plus d'informations: _setmode et codecvt_utf8.
Si les caractères Chinois ne regardez pas comme prévu, assurez-vous que la console est en utilisant une police qui supporte l'UTF-16 (ie. n'utilisez pas de polices bitmap).
OriginalL'auteur Jigsore
En général, l'utilisation de la
w
variantes, (wstring
,wfstream
,wcout
), définissez vos paramètres régionaux afin de correspondre aux besoins, accrocher unL
sur le devant de littéraux de chaîne.locale::global(locale(""))
met en place pour correspondre à l'environnement par défaut, puis sur chaque cours d'eau qui n'est pas en cours d'exécution selon que le défaut par exemplewcout.imbue(locale("Chinese_China.936"))
peut-être le nom de Microsoft pour votre terminal de paramètres régionaux. Cela a toujours été assez pour faire ce que je veux, j'espère que ça marche aussi bien pour vous.OriginalL'auteur jthill
si vous avez besoin d'afficher correctement les caractères, vous pouvez utiliser libiconv de GNU.
si vous avez seulement besoin de traiter les url, std::string fonctionne très bien.
le problème c'est windows qui est de la console de page de code, pas la chaîne elle-même.
utilisez locale dépend de l'os et de la stdc++lib de la mise en œuvre, de sorte que je n'encourage pas à l'aide .
de la fenêtre MultiByteToWideChar peut aider, mais vous devez vérifier que MME de spécifications sur la façon dont il les fonctions effectuer des conversions sur les cordes.
OriginalL'auteur wacky6