Come posso stampare UTF-8 dall’applicazione console c ++ su Windows

Per un’applicazione di console C ++ compilata con Visual Studio 2008 in inglese Windows (XP, Vista o 7). È ansible stampare sulla console e visualizzare correttamente il giapponese con codifica UTF-8 usando cout o wcout?

La console di Windows utilizza la tabella codici OEM per impostazione predefinita per visualizzare l’output.

Per modificare la chcp 65001 codici in Unicode, immettere chcp 65001 nella console o provare a modificare la chcp 65001 codici in modo programmatico con SetConsoleOutputCP .

Nota che probabilmente devi cambiare il font della console in uno che ha glifi nell’intervallo Unicode.

Ecco un articolo di MVP Michael Kaplan su come pubblicare correttamente UTF-16 attraverso la console. Potresti convertire il tuo UTF-8 in UTF-16 e inviarlo in uscita.

Non ho mai provato a impostare la codepage della console su UTF8 (non sono sicuro del motivo per cui non avrebbe funzionato … la console è in grado di gestire anche altre code page multi-byte), ma ci sono un paio di funzioni da guardare up: SetConsoleCP e SetConsoleOutputCP.

Probabilmente dovrai anche assicurarti di utilizzare un font della console in grado di visualizzare i tuoi personaggi. C’è la funzione SetCurrentConsoleFontEx , ma è disponibile solo su Vista e sopra.

Spero possa aiutare.

Questo dovrebbe funzionare:

 #include  #include  #pragma execution_character_set( "utf-8" ) int main() { SetConsoleOutputCP( 65001 ); printf( "Testing unicode -- English -- Ελληνικά -- Español -- Русский. aäbcdefghijklmnoöpqrsßtuüvwxyz\n" ); } 

Non so se influisce su qualcosa, ma il file sorgente viene salvato come Unicode (UTF-8 con firma) – Codepage 65001 su FILE -> Opzioni di salvataggio avanzate ….

Progetto -> Proprietà -> Proprietà di configurazione -> Generale -> Set di caratteri è impostato su Usa set di caratteri Unicode .

Alcuni dicono che è necessario cambiare il font della console in Lucida Console , ma dalla mia parte viene visualizzato con Consolas e Lucida Console .

Sulla console di avvio dell’app impostata su CP OEM437 predefinito. Stavo cercando di generare testo Unicode su stdout, in cui la console passava alla traduzione UTF8 _setmode (_fileno (stdout), _O_U8TEXT); e ancora non ha avuto fortuna sullo schermo anche con il font Lucida TT. Se la console è stata reindirizzata al file, sono stati creati i file UTF8 corretti.

Finalmente sono stato fortunato. Ho aggiunto la riga singola “info.FontFamily = FF_DONTCARE;” e sta funzionando ora. Spero che questo aiuto per te.

 void SetLucidaFont() { HANDLE StdOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_FONT_INFOEX info; memset(&info, 0, sizeof(CONSOLE_FONT_INFOEX)); info.cbSize = sizeof(CONSOLE_FONT_INFOEX); // prevents err=87 below if (GetCurrentConsoleFontEx(StdOut, FALSE, &info)) { info.FontFamily = FF_DONTCARE; info.dwFontSize.X = 0; // leave X as zero info.dwFontSize.Y = 14; info.FontWeight = 400; _tcscpy_s(info.FaceName, L"Lucida Console"); if (SetCurrentConsoleFontEx(StdOut, FALSE, &info)) { } } } 

Solo per ulteriori informazioni:

‘ANSI’ si riferisce a windows-125x, utilizzato per le applicazioni win32 mentre ‘OEM’ si riferisce alla tabella codici utilizzata dalle applicazioni console / MS-DOS.
Le attuali code page attive possono essere recuperate con le funzioni GetOEMCP () e GetACP ().

Per inviare correttamente qualcosa alla console, dovresti:

  1. assicurarsi che l’attuale tabella codici OEM supporti i caratteri che si desidera stampare
    (se necessario, utilizzare SetConsoleOutputCP per impostarlo correttamente)

  2. convertire la stringa dal codice ANSI corrente (win32) alla pagina di codice OEM della console

Ecco alcune utilità per farlo:

 // Convert a UTF-16 string (16-bit) to an OEM string (8-bit) #define UNICODEtoOEM(str) WCHARtoCHAR(str, CP_OEMCP) // Convert an OEM string (8-bit) to a UTF-16 string (16-bit) #define OEMtoUNICODE(str) CHARtoWCHAR(str, CP_OEMCP) // Convert an ANSI string (8-bit) to a UTF-16 string (16-bit) #define ANSItoUNICODE(str) CHARtoWCHAR(str, CP_ACP) // Convert a UTF-16 string (16-bit) to an ANSI string (8-bit) #define UNICODEtoANSI(str) WCHARtoCHAR(str, CP_ACP) /* Convert a single/multi-byte string to a UTF-16 string (16-bit). We take advantage of the MultiByteToWideChar function that allows to specify the charset of the input string. */ LPWSTR CHARtoWCHAR(LPSTR str, UINT codePage) { size_t len = strlen(str) + 1; int size_needed = MultiByteToWideChar(codePage, 0, str, len, NULL, 0); LPWSTR wstr = (LPWSTR) LocalAlloc(LPTR, sizeof(WCHAR) * size_needed); MultiByteToWideChar(codePage, 0, str, len, wstr, size_needed); return wstr; } /* Convert a UTF-16 string (16-bit) to a single/multi-byte string. We take advantage of the WideCharToMultiByte function that allows to specify the charset of the output string. */ LPSTR WCHARtoCHAR(LPWSTR wstr, UINT codePage) { size_t len = wcslen(wstr) + 1; int size_needed = WideCharToMultiByte(codePage, 0, wstr, len, NULL, 0, NULL, NULL); LPSTR str = (LPSTR) LocalAlloc(LPTR, sizeof(CHAR) * size_needed ); WideCharToMultiByte(codePage, 0, wstr, len, str, size_needed, NULL, NULL); return str; } 

Nella console, immettere chcp 65001 per cambiare la chcp 65001 codici in quella di UTF-8.