2010-10-22 26 views

Respuesta

7

Todo lo que dice la norma al respecto es que obtiene al menos los 52 caracteres en mayúscula y minúscula del alfabeto latino, los dígitos del 0 al 9, los símbolos ! " # % & ' () * + , - ./: ; <=> ? [ \ ]^_ { | } ~ y el carácter de espacio, y los caracteres de control que representan la pestaña horizontal , pestaña vertical y alimentación de formulario.

Lo único que dice acerca de la codificación numérica es que todo lo anterior se ajusta en un byte, y que el valor de cada dígito después de cero es uno mayor que el valor del anterior.

La codificación real es probablemente heredada de los valores de localización. Probablemente algo compatible con ASCII.

+0

Supongo que la configuración regional también se puede configurar en el compilador. Acabo de enterarme de la opción gcc -finput-charset (http://gcc.gnu.org/onlinedocs/cpp/Invocation.html). El valor predeterminado parece ser UTF8. No es de extrañar que haya podido imprimir UTF8Strings. – Plumenator

+0

¿El estándar también dice algo acerca de los valores ordinales de los alfabetos? – Plumenator

+0

@Plumenator: No. Ni siquiera hay un requisito que ''A' <'B''. –

6

La norma no especifica esto. Típicamente con ASCII.

+0

En Objective-C que soy capaz de crear cadenas de C utilizando diciendo: char * cStr = [objcStr UTF8String], y la impresión que printf ("% s", cStr). ¿Funciona porque ASCII es un subconjunto de UTF8? – Plumenator

+0

Sí, ASCII es un subconjunto de UTF8. – fresskoma

+3

@Plumenator que funciona porque UTF-8 fue diseñado ser lo más transparente posible para el manejo de código ya ASCII, y debido a su terminal de salida admite @nos UTF-8 – nos

1

Realmente no están "codificados" como tal, simplemente se almacenan tal cual. La cadena "Hola" representa una matriz con el carbón de leña valora 'h', 'e', 'l', 'l', 'o' y '\0', en ese orden. El estándar C tiene un conjunto de caracteres básicos que incluye estos caracteres, pero no especifica una codificación en bytes. Podría ser EBCDIC, por lo que sabes.

+0

Nota: '\ 0' es literalmente el número octal 0 con un tipo de char. Así que sí, el personaje que termina siempre es literalmente un 0. –

+0

@Martin: gracias por señalar eso. Siempre me olvido de si las extrañas reglas que rodean a los punteros nulos también se aplican a los caracteres nulos. –

+0

@Martin: Técnicamente, el tipo de un carácter literal es 'int' (al menos está en C) ... –

6

Una cadena de caracteres es prácticamente una secuencia de bytes. Eso significa que no tiene una codificación bien definida, podría ser ASCII, UTF8 o cualquier otra cosa, para el caso. Debido a que la mayoría de los sistemas operativos entienden ASCII por defecto, y el código fuente está escrito principalmente con codificación ASCII, los datos que encontrará en un simple (char *) a menudo también serán ASCII. No obstante, no hay garantía de que lo que obtenga de un (char *) sea UTF8 o incluso KOI8.

+0

En realidad, el sistema operativo más moderno usa una cadena de caracteres anchos en todas las interfaces internas (Win/Linux/Mac). Entonces no es ASCII lo que usan. –

+0

No he dicho que utilicen ASCII por defecto en sus interfaces, pero que entiendan ASCII :) – fresskoma

+0

"realmente no tiene ninguna codificación" El texto almacenado digitalmente siempre tiene alguna codificación. – Praxeolitic

1

Como ya se ha indicado otra, C tiene algunas restricciones lo que está permitido para la fuente y el carácter de ejecución codificaciones, pero es relativamente permisiva. Entonces, en particular, no es necesariamente ASCII, y en la mayoría de los casos hoy en día al menos una extensión de eso.

su entorno de ejecución se pretende hacer una traducción eventual entre la fuente y el conjunto de caracteres ejecución. Por lo general, no debería preocuparse por la codificación y, por el contrario, intentar codificar independientemente de ella. Esto explica por qué hay secuencias de escape especiales para caracteres especiales como '\n' o '\t' y codificaciones de caracteres universales como '\u0386'. Por lo general, no debería tener que buscar las codificaciones para el juego de caracteres de ejecución usted mismo.

Cuestiones relacionadas