for - codepage 1252
¿Puede el dígito ser legítimamente dependiente del local en C? (2)
- Microsoft siempre tiene la razón.
- Si Microsoft no está en lo correcto, vea el 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 tiene que codificar alrededor de los 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 rodar 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
}
En la sección que cubre setlocale, el estándar ANSI C indica en una nota a pie de página que las únicas funciones ctype.h cuyo comportamiento no se ve afectado por el entorno local actual son isdigit e isxdigit.
La implementación de isdigit de Microsoft depende de la configuración regional porque, por ejemplo, en las configuraciones regionales que usan la página de códigos 1250, el dígito solo devuelve un valor distinto de cero para los caracteres en el rango de 0x30 (''0'') - 0x39 (''9''), mientras que en las configuraciones regionales usa la página de códigos 1252 isdigit también devuelve un valor distinto de cero para los dígitos de superíndice 0xB2 (''²''), 0xB3 (''³'') y 0xB9 (''¹'').
¿Microsoft infringe el estándar de C al hacer que la configuración regional de isdigit?
En esta pregunta, estoy principalmente interesado en C90, a lo que Microsoft afirma que se ajusta, en lugar de C99.
Fondo adicional:
La documentación de Microsoft de setlocale indica incorrectamente que el dígito no se ve afectado por la parte LC_CTYPE de la configuración regional.
La sección del estándar C que cubre las funciones ctype.h contiene algunas palabras que considero ambiguas:
El comportamiento de estas funciones se ve afectado por la configuración regional actual. Aquellas funciones que tienen aspectos específicos de la ubicación 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 acerca de funciones como el dígito para el cual no hay notas sobre aspectos específicos de la localidad. Podría estar tratando de decir que se debe asumir que tales funciones dependen de la configuración regional, en cuyo caso la implementación de Microsoft de isdigit sería correcta. (Excepto que la nota a pie de página que mencioné anteriormente parece contradecir esta interpretación).
El conjunto de caracteres requerido se define en la sección 2.2.1. La Sección 2.2.1.2 luego describe el comportamiento de los caracteres de extensión:
- Los caracteres de un solo byte definidos en $ 2.2.1 estarán presentes.
- La presencia, el significado y la representación de cualquier miembro adicional es específica de la localidad.