2010-05-24 15 views
16

En la sección que cubre setlocale, el estándar ANSI C indica en una nota al pie que las únicas funciones ctype.h cuyo comportamiento no se ve afectado por la configuración regional actual son isdigit e isxdigit.Can isdigit legítimamente depende de la configuración regional en C

La implementación de Microsoft de isdigit depende de la configuración regional porque, por ejemplo, en las configuraciones regionales que usan la página de códigos 1250 isdigit solo devuelve caracteres que no son cero en el rango 0x30 ('0') - 0x39 ('9'), mientras que en las configuraciones regionales que utilizan la página de códigos 1252 isdigit también devuelven un valor distinto de cero para los dígitos superíndices 0xB2 ('²'), 0xB3 ('³') y 0xB9 ('¹').

¿Microsoft está violando el estándar C al hacer que isdigit locale sea dependiente?

En esta pregunta, estoy interesado principalmente en C90, que Microsoft dice cumplir, en lugar de C99.

fondo adicional: la propia documentación de setlocale

de Microsoft afirma incorrectamente que isdigit no se ve afectada por la parte LC_CTYPE de la localización.

La sección de la norma C que cubre las funciones ctype.h contiene una redacción que considero ambigua:

El comportamiento de estas funciones está afectado por la localización actual. Las funciones que tienen aspectos específicos de la configuración regional solo cuando no están en la configuración regional "C" se indican a continuación.

Considero que esto es ambiguo porque no está claro lo que está tratando de decir sobre funciones como isdigit para las cuales no hay notas sobre aspectos específicos de la configuración regional. Podría estar intentando decir que se debe asumir que tales funciones dependen de la configuración regional, en cuyo caso la implementación de isdigit de Microsoft estaría bien. (Excepto que la nota al pie que mencioné anteriormente parece contradecir esta interpretación.)

Respuesta

6
  1. Microsoft siempre tiene razón.
  2. Si Microsoft no es correcto ver artículo 1

Microsoft siempre tiene su propia interpretación de la especificación. Y generalmente la frase: "Pero Microsoft está equivocado", no tiene ningún peso con su CEO, por lo que debe codificar errores/interpretaciones de MS.

La cantidad de código para admitir el comportamiento incorrecto de IE y Outlook es asombrosa.

En muchos casos, la única solución es para lanzar su propia versión de la función que hace lo correcto y hacer algo como esto:

int my_isdigit(int c) 
{ 
#ifdef WIN32 
    your implementation goes here 
#else 
    return isdigit(c); 
#endif 
} 
+1

+1 para un pensamiento muy práctico :) –

4

El conjunto de caracteres requerido se define en la sección 2.2.1 . La sección 2.2.1.2 continúa describiendo el comportamiento de los caracteres de extensión:

  • Los caracteres de un solo byte definidos en $ 2.2.1 deben estar presentes.
  • La presencia, el significado y la representación de cualquier miembro adicional es específico de la configuración regional.
Cuestiones relacionadas