2012-08-30 29 views
12

encontré el estándar C (C99 y C11) vaga con respecto a las posiciones de código de caracteres/cuerda y reglas de codificación:C estándar: conjunto de caracteres y codificación cadena especificación

primer lugar el estándar define the source character set y the execution character set. Esencialmente proporciona un conjunto de glifos, pero no asocia ningún valor numérico con ellos - Entonces, ¿cuál es el juego de caracteres predeterminado?

No estoy preguntando acerca de la codificación aquí, sino solo del glifo/repertorio al mapeo de puntos numéricos/de código. Define universal character names como ISO/IEC 10646, pero ¿dice que este es el juego de caracteres predeterminado?

Como una extensión de lo anterior, no pude encontrar nada que diga qué caracteres representan las secuencias de escape numérico \ 0 y \ x.

A partir de los estándares de C (C99 y C11, no el registro ANSI C) Tengo el siguiente sobre el carácter y literales de cadena:

+---------+-----+------------+----------------------------------------------+ 
| Literal | Std | Type  | Meaning          | 
+---------+-----+------------+----------------------------------------------+ 
| '...' | C99 | int  | An integer character constant is a sequence | 
|   |  |   | of one or more multibyte characters   | 
| L'...' | C99 | wchar_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| u'...' | C11 | char16_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| U'...' | C11 | char32_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| "..." | C99 | char[]  | A character string literal is a sequence of | 
|   |  |   | zero or more multibyte characters   | 
| L"..." | C99 | wchar_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u8"..." | C11 | char[]  | A UTF-8 string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u"..." | C11 | char16_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| U"..." | C11 | char32_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
+---------+-----+------------+----------------------------------------------+ 

Sin embargo no pude encontrar nada acerca de la codificación reglas para estos literales. UTF-8 parece indicar la codificación UTF-8, pero no creo que se mencione explícitamente en ninguna parte. Además, para los otros tipos ¿la codificación es indefinida o depende de la implementación?

No estoy familiarizado con la especificación UNIX. ¿Especifica la especificación de UNIX alguna restricción adicional a estas reglas?

También si alguien me puede decir qué esquema de codificación/chasfer es utilizado por GCC y MSVC que también ayudaría.

Respuesta

5

C no es codicioso sobre conjuntos de caracteres. No existe el "juego de caracteres predeterminado", su implementación está definida, aunque es principalmente ASCII o UTF-8 en la mayoría de los sistemas modernos.

+0

¿La implementación también está definida para u8 "..." literales? Parece indicar la codificación UTF-8 para ese literal en particular. – tinkerbeast

+0

@tinkerbeast no - C no requiere ningún conjunto de caracteres en particular. u8 "..."indica que la cadena debe estar compuesta de caracteres que caben en un almacenamiento de ocho bits. –

+0

@ H2CO3 C11 dice que los literales U8 son utf-8. No estoy seguro de que los compiladores hayan llegado a implementar eso aunque – nos

4

El estándar no especifica una codificación predeterminada porque la práctica existente ya tenía C implementada en máquinas con muchas codificaciones diferentes, por ejemplo, mainframes de Honeywell y mainframes de IBM.

Esperaría que gcc tomara su valor predeterminado de la configuración regional actualmente especificada por LC_CHARSET, pero nunca lo he probado.

VC++ toma su valor predeterminado de una configuración del Panel de control. La configuración predeterminada del Panel de control varía según el país en el que se compró Windows, y la mayoría de los usuarios nunca lo cambian, pero pueden cambiarlo mientras que la instalación de Windows puede cambiarlo más adelante.

Los trigraphs se inventaron para que un programa fuente se pudiera copiar de un entorno con una configuración regional a un entorno con una configuración regional ligeramente diferente y aún así compilarse. Por ejemplo, si un usuario de Windows en China usa trigraphs, un usuario de Windows en Grecia podría compilar el mismo programa fuente. Sin embargo, si las configuraciones regionales difieren demasiado, por ejemplo, una que usa EBCDIC y otra que usa EUC, los trigrafos no serán suficientes.

+0

Por cierto, ¿tienes alguna idea de por qué los trigrafos fueron elegidos para ser tan feos, por qué operan dentro de la cadena y los literales de los personajes? Mi teoría, mirando los códigos, es que fueron elegidos por una persona pasiva-agresiva que no los quería en primer lugar. Creo que debería haber sido perfectamente suficiente para proporcionar que si una línea comienza con '#define __BACKSLASH_DESIGNATOR', cualquier aspecto del personaje o la secuencia que sigue (que debe contener al menos un carácter fuera del conjunto estándar de C) se consideraría como una barra diagonal inversa; otros caracteres podrían usar diagramas de barra invertida. . – supercat

+1

@supercat: [Esta página] (http://www.lysator.liu.se/c/rat/b.html#2-2-1-1) explica el propósito de los trigrafos. Data de cuando el estándar ANSI C todavía era un borrador, y es parte de un documento que contiene los fundamentos de muchas de las decisiones tomadas en ese estándar. –

+0

@PeterO .: gracias por eso. Todavía tengo curiosidad por saber si los juegos de caracteres que se usaron no tenían una barra invertida * y * no tenían un carácter no ASCII que pudiera declararse con el mismo efecto. Cuando estaba programando PL/I, los terminales eran todos ASCII y no tenían un carácter '¬' requerido para PL/I, pero como PL/I no usaba'^', la traducción ASCII-a-EBCDIC simplemente convirtió el ASCII '^' al EBCDIC '¬'. Me pregunto si el mismo enfoque podría haber funcionado con C: declarar que cada implementación debe designar un carácter de "escape" (que sería '\' para ASCII), y ... – supercat

Cuestiones relacionadas