lower - toupper c++
¿Qué tolower en C++? (3)
Debe tenerse en cuenta que los diseñadores de idiomas estaban al tanto del cctype
de cctype
cuando se creó el tolower
locale
. Mejoró en 2 formas primarias:
- Como se menciona en la respuesta de progress_overload, la versión de
locale
permitió el uso del tipo defacet ctype
, incluso un usuario modificado, sin requerir la combinación de un nuevoLC_CTYPE
a través desetlocale
y la restauración del anteriorLC_CTYPE
- De la sección 7.1.6.2 [dcl.type.simple] 3:
Se define por la implementación si los objetos de tipo
char
se representan como cantidades firmadas o no firmadas. El especificadorsigned
obliga a los objetoschar
a ser firmados
Lo que crea un potencial de comportamiento indefinido con la versión cctype
de tolower
''s si es argumento:
No se puede representar como
unsigned char
y no es igual aEOF
Por lo tanto, hay una entrada y salida static_cast
adicional requerida por la versión cctype
la cctype
de tolower
:
transform(cbegin(foo), cend(foo), begin(foo), [](const unsigned char i){ return tolower(i); });
Como la versión de locale
opera directamente en caracteres, no es necesario realizar una conversión de tipo.
Entonces, si no necesita realizar la conversión en un facet ctype
diferente, simplemente se convierte en una pregunta de estilo si prefiere la transform
con un lambda requerido por la versión de cctype
, o si prefiere las versiones de locale
:
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), size(foo)));
Dada la string foo
, he escrito answers sobre cómo usar el tolower
cctype
para convertir los caracteres en minúsculas
transform(cbegin(foo), cend(foo), begin(foo), static_cast<int (*)(int)>(tolower))
Pero he empezado a considerar el tolower
locale
, que podría ser usado así:
use_facet<ctype<char>>(cout.getloc()).tolower(data(foo), next(data(foo), foo.size()));
- ¿Hay alguna razón para preferir uno de estos sobre el otro?
- ¿Su funcionalidad difiere en absoluto?
- Me refiero a que, aparte del hecho de que
tolower
acepta y devuelve unint
¿se supone que son solo algunas cosas anticuadas de C?
Desafortunadamente, ambos son igualmente malos. Aunque std::string
pretende ser una cadena codificada en utf-8, ninguno de los métodos / función (incluido tolower), realmente es consciente de utf-8. Por lo tanto, tolower
/ tolower
+ locale puede funcionar con caracteres que son de un solo byte (= ASCII), que fallarán para todos los demás conjuntos de idiomas.
En Linux, usaría la biblioteca de ICU. En Windows, CharUpper
función CharUpper
.
En el primer caso (cctype) la configuración regional se establece implícitamente:
Convierte el carácter dado en minúsculas según las reglas de conversión de caracteres definidas por la configuración regional C instalada actualmente.
En el segundo caso (configuración regional), debe establecer explícitamente la configuración regional:
Convierte el parámetro c en su equivalente en minúscula si c es una letra mayúscula y tiene un equivalente en minúscula, según lo determine la faceta ctype de locale locale. Si no es posible dicha conversión, el valor devuelto no se modifica.