lo que necesita hacer una distinción entre el conjunto de caracteres de origen, el conjunto de caracteres de ejecución, el carácter de ejecución de alambre fijado y es versiones básicas:
El conjunto básico de caracteres de origen:
§ 2.1. 1: el conjunto de caracteres fuente básico consta de 96 caracteres [...]
Este juego de caracteres tiene exactamente 96 caracteres. Encajan en 7 bits. Los caracteres como @
no están incluidos.
Veamos algunos ejemplos de representaciones binarias para algunos caracteres de origen básicos. Pueden ser completamente arbitrarios y no es necesario que correspondan a los valores ASCII.
A -> 0000000
B -> 0100100
C -> 0011101
El conjunto básico de caracteres de ejecución ...
§2.1.3: El carácter básico de ejecución y establece la ejecución básica de conjunto de caracteres anchos deberá contener cada uno de todos los miembros de la fuente básica de carácter set, más los caracteres de control que representan alerta, retroceso y retorno de carro, más un carácter nulo (respectivamente, carácter ancho nulo), cuya representación tiene todos los bits cero.
Como se mencionó, el juego de caracteres de ejecución básica contiene todos los miembros del juego de caracteres básicos de origen. Todavía no incluye ningún otro personaje como @
. El conjunto de caracteres de ejecución básica puede tener una representación binaria diferente.
Como se indicó, el conjunto de caracteres de ejecución básica contiene representaciones para el retorno de carro, un carácter nulo y otros caracteres.
A -> 10110101010
B -> 00001000101 <- basic source character set
C -> 10101011111
----------------------------------------------------------
null -> 00000000000
Backspace -> 11111100011
Si el juego de caracteres básico de ejecución es de 11 bits de longitud (como en este ejemplo) el tipo de datos char será lo suficientemente grande como para almacenar 11 bits, pero puede ser más largo.
... Y la ejecución amplio conjunto de caracteres básicos:
La ejecución de ancho carácter básico se utiliza para caracteres de ancho (wchar_t). Básicamente es lo mismo que el conjunto de caracteres de ejecución básica, pero también puede tener diferentes representaciones binarias.
A -> 1011010101010110101010
B -> 0000100010110101011111 <- basic source character set
C -> 1010100101101000011011
---------------------------------------------------------------------
null -> 0000000000000000000000
Backspace -> 1111110001100000000001
El único miembro fijo es el carácter nulo que tiene que ser una secuencia de 0
bits.
La conversión entre carácter básico establece:
§2.1.1.5: Cada miembro de caracteres de origen conjunto, secuencia de escape, o-character-nombre universal en caracteres literales y literales de cadena se convierte en un miembro de el juego de caracteres de ejecución (2.13.2, 2.13.4).
Luego se compila un archivo fuente C++ cada carácter del conjunto de caracteres de origen se convierte en el conjunto de caracteres de ejecución básica (ancho).
Ejemplo:
const char* string0 = "BA\bC";
const wchar_t string1 = L"BA\bC";
Desde string0
es un carácter normal que se convertirá en el conjunto de caracteres ejecución básica y string1
se convertirá a la ejecución amplio conjunto carácter básico.
string0 -> 00001000101 10110101010 11111100011 10101011111
string1 -> 0000100010110101011111 1011010101010110101010 // continued
1111110001100000000001 1010100101101000011011
Algo sobre codificaciones de archivo:
Hay varios tipos de codificaciones de archivo. Por ejemplo, ASCII
que tiene 7 bits de longitud. Windows-1252
que tiene una longitud de 8 bits (conocido como ANSI
). ASCII
no contiene caracteres que no sean en inglés. ANSI
contiene algunos caracteres europeos como ä Ö ä Õ ø
.
Las codificaciones de los archivos más recientes como UTF-8
o UTF-32
pueden tener caracteres de cualquier idioma. UTF-8
es que los caracteres son de longitud variable. UTF-32
tienen 32 bits de longitud.
archivos Enconding requisitos:
mayoría de los compiladores ofrecen modificador de línea de comandos para especificar la codificación del archivo del archivo de origen.
A c archivo fuente ++ necesita ser codificado en una codificación de archivos, que tiene una representación del conjunto de caracteres fuente básica. Por ejemplo: la codificación de archivo del archivo de origen debe tener una representación del carácter ;
.
Si puede escribir el carácter ;
dentro de la codificación elegida como la codificación del archivo de origen, esa codificación no es adecuada como una codificación de archivo de código fuente de C++.
juegos de caracteres no básicas:
caracteres no incluidos en el juego de caracteres fuente básica pertenecen al conjunto de caracteres de origen. El juego de caracteres fuente es equivalente a la codificación del archivo.
Por ejemplo: el carácter @
no es incluir en el carácter fuente básica pero puede ser incluido en el conjunto de caracteres de origen. La codificación de archivo elegida del archivo fuente de entrada puede contener una representación de @
. Si no contiene una representación para @
, no puede usar el carácter @
dentro de cadenas.
caracteres no incluidos en la base (ancho) juego de caracteres pertenecen a la ejecución (ancho) juego de caracteres.
Recuerde que el compilador convierte el carácter del personaje de origen establecido en el conjunto de caracteres de ejecución y la ejecución del juego de caracteres de ancho. Por lo tanto, es necesario que haya una forma de convertir estos caracteres.
Por ejemplo: si especifica Windows-1252
como la codificación del juego de caracteres de origen y especificar ASCII
como el carácter amplio conjunto de ejecución no hay manera de convertir esta cadena:
const char* string0 = "string with European characters ö, Ä, ô, Ð.";
Estos caracteres no pueden ser representados en ASCII
.
Especificación de conjuntos de caracteres:
Estos son algunos ejemplos de cómo especificar los conjuntos de caracteres utilizando gcc. Los valores predeterminados están incluidos.
-finput-charset=UTF-8 <- source character set
-fexec-charset=UTF-8 <- execution character set
-fwide-exec-charset=UTF-32 <- execution wide character set
Con UTF-8 y UTF-32 como c ficheros fuente por defecto de codificación ++ pueden contener cadenas con carácter de cualquier idioma. Los caracteres UTF-8 pueden convertirse en ambos sentidos sin problemas.
El conjunto extendido de caracteres:
§1.1.3: carácter multibyte, una secuencia de uno o más bytes que representan un miembro del conjunto de caracteres extendidos de cualquiera de la fuente o el entorno de ejecución. El conjunto de caracteres extendido es un superconjunto del conjunto de caracteres básicos (2.2).
Los caracteres de multibyte son más largos que una entrada de los caracteres normales. Contienen una secuencia de escape que los marca como carácter multibyte.
Los caracteres de multibyte se procesan según la configuración regional establecida en el entorno de tiempo de ejecución del usuario. Estos caracteres multibyte se convierten en tiempo de ejecución al conjunto de codificación en el entorno del usuario.
Esta frase es un poco difícil de seguir: "Si puede escribir el carácter, dentro de la codificación elegida como la codificación del archivo fuente, esa codificación no es adecuada como una codificación de archivo fuente de C++". Qué significa eso? – JCx
Creo '-fexec-charset = UTF-8' es un mal ejemplo porque no es conforme. La idea es clara: el carácter de ejecución _basic set_ debe ser Unicode, pero luego (como usted mismo ha resaltado) 'char' debe tener 20 bits de ancho para contener todos los valores Unicode. Sin embargo, 'UTF-8' es una codificación de longitud variable, lo que significa que solo es adecuado como el conjunto de caracteres _extendido_. – MSalters