Ho Microsoft Visual Studio 2010 su Windows 7 a 64 bit. (Nella proprietà del progetto "Set di caratteri" è impostato su "Non impostato", tuttavia ogni impostazione porta ad stessa uscita.) CodiceSpiegazione necessaria per un caso UTF-8 vs cpp
Fonte:
using namespace std;
char const charTest[] = "árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP\n";
cout << charTest;
printf(charTest);
if(set_codepage()) // SetConsoleOutputCP(CP_UTF8); // *1
cerr << "DEBUG: set_codepage(): OK" << endl;
else
cerr << "DEBUG: set_codepage(): FAIL" << endl;
cout << charTest;
printf(charTest);
* 1: Compreso windows.h
scombina le cose, così ho lo includo da una cpp separata
Il file binario compilato contiene la stringa come sequenza di byte UTF-8 corretta. Se imposto la console su UTF-8 con chcp 65001
e sul numero type main.cpp
, la stringa viene visualizzata correttamente.
Test (console impostato per utilizzare font Lucida Console):
D:\dev\user\geometry\Debug>chcp
Active code page: 852
D:\dev\user\geometry\Debug>listProcessing.exe
├írv├şzt┼▒r┼Ĺ t├╝k├Ârf├║r├│g├ęp ├üRV├ŹZT┼░R┼É T├ťK├ľRF├ÜR├ôG├ëP
├írv├şzt┼▒r┼Ĺ t├╝k├Ârf├║r├│g├ęp ├üRV├ŹZT┼░R┼É T├ťK├ľRF├ÜR├ôG├ëP
DEBUG: set_codepage(): OK
��rv��zt��r�� t��k��rf��r��g��p ��RV��ZT��R�� T��K��RF��R��G��P
árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP
Qual è la spiegazione dietro questo? Posso in qualche modo chiedere allo cout
di funzionare come printf
?
ATTACCO
Molti dice che console di Windows non supporta caratteri UTF-8 a tutti. Sono un ragazzo ungherese in Ungheria, il mio Windows è impostata su Inglese (tranne formati di data, sono impostati ungherese) e caratteri cirillici vengono ancora visualizzati correttamente al fianco di lettere ungheresi:
(la mia console di default codepage è CP852)
possibile duplicato di [Come scrivere un facciale: codecvt facet?] (http: // stackoverflow.com/questions/ 2971386/how-do-i-write-a-stdcodecvt-facet) –
@HansPassant Non credo che sia lo stesso. Sembra correlato, ma non spiega esplicitamente la differenza tra 'cout' e' printf'. E dovrei scrivere anche una faccetta 'codecvt' per dire a' cout' di non convertire nulla? Ci dovrebbe essere un modo più semplice, spero ... – Notinlist