2012-03-15 10 views
7

Tengo algunas preguntas para tratar de entender las diferentes codificaciones.C/C++ preguntas de codificación

¿Cuál es la codificación predeterminada para las cadenas?

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? 

Y entonces, ¿cómo podría crear una cadena UTF-8? Si quería mostrar caracteres UTF-8 en un cuadro de mensajes?

Mis preguntas están dirigidas principalmente a Windows por cierto, pero si es diferente en diferentes sistemas operativos que estoy interesado en conocer.

Respuesta

9

La norma no especifica la codificación para cadenas angostas o anchas. El vendedor normalmente buscará algo que no sea sorprendente en la máquina objetivo, pero es difícil decir más que eso. Esto significa, por ejemplo, que la cadena estrecha probablemente use ASCII (o, realmente, algo así como ISO-8859) en la mayoría de las computadoras personales, pero EBCDIC en una computadora central de IBM.

Las cadenas de caracteres anchos también varían, por ejemplo, la mayoría de los compiladores en Windows usarían UTF-16. En Linux, UTF-32/UCS-4 es probablemente más común.

La mención de MessageBox sugiere Windows, donde (como supondría) normalmente tendrá UTF-16 para cadenas anchas. En este caso, si especifica cadenas anchas explícitamente, también desea especificar explícitamente la versión amplia de la función - MessageBoxW.

En cuanto a la creación de un literal de cadena UTF-8, todo lo que puedo decir es "buena suerte". Depende de Visual Studio hacerlo, pero si hay una manera de lograrlo, no estoy al tanto.

+2

C++ x11 agrega un prefijo 'u8' para literales de cadena UTF-8, por ejemplo:' u8 "Hello World" ', sin embargo, hasta que C++ x11 sea adoptado por los proveedores de compiladores C++, solo tendrá que codificar UTF -8 cadena de forma manual en su lugar. Por ejemplo, en tiempo de ejecución usando 'WideCharToMultiByte()' con la página de códigos 65001, o en tiempo de compilación usando un '' char [] 'literal que contiene valores de octetos UTF-8. –