In C ++ quando usare WCHAR e quando usare CHAR

Ho una domanda:

Alcune librerie usano WCHAR come parametro di testo e altre usano CHAR (come UTF-8): ho bisogno di sapere quando usare WCHAR o CHAR quando scrivo la mia libreria.

Usa char e trattalo come UTF-8. Ci sono molte ragioni per questo; questo sito web lo riassume molto meglio di me:

http://utf8everywhere.org/

Si raccomanda di convertire da wchar_t a char (da UTF-16 a UTF-8) non appena lo si riceve da qualsiasi libreria e di riconvertirlo quando è necessario passare le stringhe ad esso. Quindi, per rispondere alla tua domanda, usa sempre char tranne nel punto in cui un’API richiede di passare o ricevere wchar_t .

La domanda giusta non è quale tipo usare, ma quale dovrebbe essere il tuo contratto con gli utenti della tua biblioteca. Sia char che wchar_t possono significare più di una cosa.

La risposta giusta per me è usare char e considerare ogni cosa utf-8 codificata, come suggerisce utf8everywhere.org. Ciò faciliterà anche la scrittura di librerie multipiattaforma.

Assicurati di fare comunque un uso corretto delle stringhe. Alcune API come fopen () accettano una stringa char * e la trattano in modo diverso (non come UTF-8) quando vengono compilate su Windows. Se Unicode è importante per te (e probabilmente lo è, quando hai a che fare con le stringhe), assicurati di gestire correttamente le stringhe. Un buon esempio può essere visto in boost :: locale. Raccomando anche di usare boost :: nowide su Windows per far sì che le stringhe vengano gestite correttamente all’interno della libreria.

WCHAR (o wchar_t sul compilatore Visual C ++) viene utilizzato per le stringhe Unicode UTF-16 .
Questa è la codifica stringa “nativa” utilizzata dalle API Win32.

CHAR (o char ) può essere utilizzato per diversi altri formati di stringa: ANSI, MBCS, UTF-8.

Poiché UTF-16 è la codifica nativa delle API Win32, potresti voler utilizzare WCHAR (e meglio una corretta class di stringa basata su esso, come std::wstring ) al limite dell’API Win32, all’interno della tua app.

Ed è ansible utilizzare UTF-8 (quindi, CHAR / char e std::string ) per scambiare il testo Unicode al di fuori del limite dell’applicazione. Ad esempio: UTF-8 è ampiamente utilizzato su Internet e quando si scambia il testo UTF-8 tra piattaforms diverse non si ha il problema dell’endianità (invece con UTF-16 è necessario considerare sia l’UTF-16BE big- endian e i casi little-endian UTF-16LE).

È ansible convertire tra UTF-16 e UTF-8 utilizzando le API Win32 WideCharToMultiByte() e MultiByteToWideChar() . Si tratta di API Pure-C, che possono essere comodamente racchiuse in codice C ++, utilizzando classi di stringhe anziché puntatori di caratteri non elaborati e eccezioni invece di codici di errore non elaborati. Puoi trovare un esempio di questo qui .

In Windows ci atteniamo a WCHARS. std :: wstring. Soprattutto perché se non si finisce per dover convertire perché chiama le funzioni di Windows.

Ho la sensazione che provare a usare utf8 internamente semplicemente a causa di http://utf8everywhere.org/ ci morde nel culo più avanti.

Si consiglia di utilizzare, quando si sviluppa un’applicazione Windows, ricorso a TCHAR. La cosa buona di TCHAR è che possono essere sia normali che wchar, a seconda che l’impostazione Unicode sia impostata o meno. Una volta fatto ricorso a TCHAR, ci si assicura che tutte le manipolazioni di stringhe che si usano inizino anche con il prefisso _t (es. _Tcslen per la lunghezza della stringa). In questo modo saprai che il tuo codice funzionerà sia in ambienti Unicode che ASCII.