Cómo convertir una cadena en minúsculas en C++

Jinku Hu 11 diciembre 2023
Cómo convertir una cadena en minúsculas en C++

En este artículo, introduciremos cómo convertir string a minúsculas en C++.

Lo primero que hay que preguntarse antes de hacer la conversión de cadenas en C++ es ¿qué tipo de codificación tiene mi cadena de entrada? Porque si usas std::lower con caracteres de codificación multi-byte, entonces definitivamente obtendrás un código erróneo.

Aunque la siguiente función parece una buena implementación de la conversión de minúsculas de std::string, pero no convierte todos los caracteres a minúsculas porque su codificación es UTF-8.

#include <algorithm>
#include <iostream>

std::string toLower(std::string s) {
  std::transform(s.begin(), s.end(), s.begin(),
                 [](unsigned char c) { return std::tolower(c); });
  return s;
}

int main() {
  std::string string1 = u8"ÅSH to LoWer WÅN";
  std::cout << "input string:  " << string1 << std::endl
            << "output string: " << toLower(string1) << std::endl;
  return 0;
}

El código anterior funciona bien para las cadenas ASCII y algunas otras cadenas no ASCII también, pero una vez que le das una entrada un poco inusual, digamos algunos símbolos latinos, la salida no sería satisfactoria.

Resultado:

input string:  ÅSH to LoWer WÅN
output string: Åsh to lower wÅn

Es incorrecto ya que debería haber bajado el símbolo Å a å. Entonces, ¿cómo podemos resolver este problema para obtener la salida correcta?

La mejor manera portátil de hacerlo es usando la biblioteca ICU (International Components for Unicode), que es lo suficientemente madura para ofrecer estabilidad, ampliamente accesible, y mantendrá su código multiplataforma.

Sólo necesitamos incluir los siguientes encabezados en nuestro archivo fuente. Es muy probable que estas bibliotecas ya estén incluidas y disponibles en su plataforma, así que los ejemplos de código deberían funcionar bien. Pero si recibes errores de IDE/tiempo de compilación, por favor, consulta las instrucciones para descargar la biblioteca en sitio web de documentación de la UCI.

#include <unicode/locid.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

Ahora que hemos incluido cabeceras, podemos escribir std::string en el código de conversión en minúsculas de la siguiente manera:

#include <unicode/locid.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>

#include <iostream>

int main() {
  std::string string1 = u8"ÅSH to LoWer WÅN";
  icu::UnicodeString unicodeString(string1.c_str());
  std::cout << "input string:  " << string1 << std::endl
            << "output string: " << unicodeString.toLower() << std::endl;
  return 0;
}

Tenga en cuenta que debemos compilar este código con las siguientes banderas del compilador para incluir las dependencias de la biblioteca ICU:

g++ sample_code.cpp -licuio -licuuc -o sample_code

Ejecuta el código y obtendremos la salida correcta como se esperaba:

input string:  ÅSH to LoWer WÅN
output string: åsh to lower wån

La misma función puede procesar algún lenguaje diferente que no solemos esperar como entrada del usuario, y también podemos especificar explícitamente la locale como un parámetro de la función toLower:

#include <iostream>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
#include <unicode/locid.h>

int main() {
    std::string string2 = "Κάδμῳ ἀπιϰόμενοι.. Ελληνας ϰαὶ δὴ ϰαὶ γράμματα, οὐϰ ἐόντα πρὶν Ελλησι";
    icu::UnicodeString unicodeString2(string2.c_str());
    std::cout  << unicodeString2.toLower("el_GR") << std::endl;
    return 0;
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ String