upper lower convert change c++ string locale ctype tolower

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:

  1. Como se menciona en la respuesta de progress_overload, la versión de locale permitió el uso del tipo de facet ctype , incluso un usuario modificado, sin requerir la combinación de un nuevo LC_CTYPE a través de setlocale y la restauración del anterior LC_CTYPE
  2. 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 especificador signed obliga a los objetos char 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 a EOF

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 un int ¿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.

tolower

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.

http://www.cplusplus.com/reference/locale/tolower/