experiencia - que poner en un curriculum en habilidades
QuiƩn determina el orden de los personajes (6)
Tengo una consulta basada en el programa a continuación -
char ch;
ch = ''z'';
while(ch >= ''a'')
{
printf("char is %c and the value is %d/n", ch, ch);
ch = ch-1;
}
¿Por qué la impresión de un conjunto completo de letras minúsculas no está garantizada en el programa anterior? Si C no ofrece muchas garantías sobre el orden de los caracteres en forma interna, ¿quién lo hace y cómo?
¿Por qué la impresión de un conjunto completo de letras minúsculas no está garantizada en el programa anterior?
Porque es posible usar C con una codificación de caracteres EBCDIC , en la cual las letras no son consecutivas.
El implementador del compilador elige su conjunto de caracteres subyacente. Lo único que el estándar tiene que decir es que debe haber un cierto número mínimo de caracteres disponibles y que los caracteres numéricos son contiguos.
Los caracteres necesarios para un entorno de ejecución C99 son de A
a Z
, de la aa la z
, de 0
a 9
(que deben estar juntos y en orden), cualquiera de !"#%&''()*+,-./:;<=>?[/]^_{|}~
, espacio, pestaña horizontal, pestaña vertical, avance de página, alerta, retroceso, retorno de carro y nueva línea. Esto permanece sin cambios en el borrador actual de C1x, la próxima iteración de ese estándar .
Todo lo demás depende de la implementación.
Por ejemplo, código como:
int isUpperAlpha(char c) {
return (c >= ''A'') && (c <= ''Z'');
}
se romperá en el mainframe que usa EBCDIC, dividiendo los caracteres en mayúscula en dos regiones.
El código verdaderamente portátil lo tendrá en cuenta. El resto del código debe documentar sus dependencias.
Una implementación más portátil de su ejemplo sería algo así como:
static char chrs[] = "zyxwvutsrqponmlkjihgfedcba";
char *pCh = chrs;
while (*pCh != 0) {
printf ("char is %c and the value is %d/n", *pCh, *pCh);
pCh++;
}
Si desea una solución portátil real , probablemente deba usar islower()
ya que el código que verifica solo los caracteres latinos no será portátil (por ejemplo) en griego usando Unicode para su juego de caracteres subyacente.
En estos días, las personas que llaman a su código como no portátil se están dedicando a una pedantería inútil. El soporte para codificaciones incompatibles con ASCII solo permanece en el estándar C debido a los mainframes heredados de EBCDIC que se niegan a morir. Nunca encontrará una codificación de caracteres no compatibles con ASCII en ninguna computadora moderna, ahora o en el futuro. Dale algunas décadas, y nunca encontrarás nada más que UTF-8.
Para responder a su pregunta sobre quién decide la codificación de caracteres: si bien está nominalmente a merced de su implementación (el compilador de C, la biblioteca y el sistema operativo), finalmente se decidió por Internet, tanto la práctica existente como los estándares IETF. Presumiblemente, los sistemas modernos están destinados a comunicarse e interoperar entre sí, y sería un gran dolor de cabeza tener que convertir cada encabezado de protocolo, archivo html, fuente de JavaScript, nombre de usuario, etc., entre codificaciones compatibles con ASCII y EBCDIC o algunos otro desastre local.
En los últimos tiempos, quedó claro que una codificación universal no solo para el texto analizado en máquina sino también para el texto en lenguaje natural también es muy deseable. (El intercambio de texto en lenguaje natural no es tan fundamental como el texto analizado por máquina, pero sigue siendo muy común e importante). Unicode proporcionó el juego de caracteres, y como la única codificación Unicode compatible con ASCII, UTF-8 es bastante sucesora de ASCII como la codificación de caracteres universal.
Está determinado por cualquiera que sea el conjunto de caracteres de ejecución.
En la mayoría de los casos hoy en día, ese es el conjunto de caracteres ASCII, pero C no tiene ningún requisito de que se use un juego de caracteres específico.
Tenga en cuenta que hay algunas garantías sobre el orden de los caracteres en el conjunto de caracteres de ejecución. Por ejemplo, se garantiza que los dígitos "0" a "9" tienen un valor uno mayor que el valor del dígito anterior.
Obviamente, está determinado por la implementación de C que está utilizando, pero lo más probable es que esté determinado por el Código Estándar Estadounidense para el Intercambio de Información ( ASCII ).
Te contesto demasiado tarde, pero aparte de lo que ya dije, quiero agregar un poco.
En la 5ª fase de traducción (parte del preprocesador), cada miembro del juego de caracteres fuente se convierte al carácter correspondiente del juego de caracteres de ejecución. Cita de ISO 9899
, 5.1.1.2p5
- Cada miembro de conjunto de caracteres de origen y secuencia de escape en constantes de caracteres y literales de cadenas se convierte al miembro correspondiente del conjunto de caracteres de ejecución; si no hay un miembro correspondiente, se convierte en un miembro definido por la implementación que no sea el carácter nulo (ancho). 7)
No es necesario que el conjunto de caracteres de origen sea el mismo que el conjunto de caracteres de ejecución; como otros dicen, si el conjunto de caracteres de ejecución es EBCDIC del mainframe de IBM , la lógica no es la misma que en el caso del juego de caracteres ASCII.