2012-03-15 19 views
7

Ho alcune domande nel tentativo di capire le diverse codifiche.Domande di codifica C/C++

Qual è la codifica predefinita per le stringhe?

char ascii[]= "Some text"; // This is plain ASCII right? 
wchar_t utf[] = L"Some Text"; // Is this UTF-16? Or ASCII stored in wchar_t's? 
MessageBoxW(NULL, L"Hello", L"HI", MB_OK); // What encodings are the 2 strings in? 

E quindi, come dovrei creare una stringa UTF-8? Se volessi visualizzare caratteri UTF-8 in un MessageBox?

Le mie domande sono principalmente rivolte a Windows, ma se è diverso su sistemi operativi diversi, sono interessato a sapere.

risposta

9

Lo standard non specifica la codifica per stringhe strette o larghe. Normalmente il venditore punta a qualcosa che non sorprende sul computer di destinazione, ma è difficile dire di più. Ciò significa, ad esempio, che la stringa stretta utilizza probabilmente ASCII (o, in realtà, qualcosa come ISO-8859) sulla maggior parte dei personal computer, ma EBCDIC su un mainframe IBM.

Anche le stringhe di caratteri ampi variano, ad esempio la maggior parte dei compilatori su Windows utilizza UTF-16. Su Linux, UTF-32/UCS-4 è probabilmente più comune.

La menzione di MessageBox suggerisce Windows, dove (come hai ipotizzato) di solito avrai UTF-16 per stringhe larghe. In questo caso, se si specificano esplicitamente stringhe larghe, si desidera anche specificare esplicitamente la versione estesa della funzione - MessageBoxW.

Per quanto riguarda la creazione di una stringa letterale UTF-8, tutto quello che posso dire è "buona fortuna". Spetterebbe a Visual Studio farlo, ma se c'è un modo per farlo, non ne sono consapevole.

+2

Il C++ x11 aggiunge un prefisso 'u8' per i valori letterali stringa UTF-8, ad esempio:' u8 "Hello World" ', tuttavia fino a quando C++ x11 viene adottato dai compilatori C++, sarà necessario codificare UTF -8 stringa manualmente invece. Ad esempio, in fase di esecuzione usando 'WideCharToMultiByte()' con codepage 65001, o in fase di compilazione usando un valore letterale 'char []' che contiene i valori dell'ottetto UTF-8. –