Cómo podemos convertir un multi de la lengua o la cadena unicode cadena a mayúsculas/minúsculas en C o C++.

  • Comprobar este hilo stackoverflow.com/questions/1614595/…. Puede ser que te ayude.
  • ¿Qué entiende usted por «Unicode»? Hay un montón de diferentes codificaciones definido por el estándar Unicode—que estás usando? UTF-8? UTF-16? UTF-32?
  • google antes risa una pregunta aquí
  • Con unicode, ser muy cauteloso si se utiliza un todo en mayúsculas comparación, ya que muchas de las implementaciones no comprueba correctamente que los caracteres están en mayúsculas o minúsculas.
  • site.icu-project.org
InformationsquelleAutor Pankaj | 2013-08-01

8 Comentarios

  1. 11

    Si tu sistema ya está en UTF-8, mediante el uso de std::use_facet, se puede escribir:

    #include <iostream>
    #include <locale.h>
    
    int main() {
        std::locale::global(std::locale(""));  //(*)
        std::wcout.imbue(std::locale());
        auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale());
    
        std::wstring str = L"Zoë Saldaña played in La maldición del padre Cardona.";
    
        f.toupper(&str[0], &str[0] + str.size());
        std::wcout << str << std::endl;
    
        return 0;
    }

    Y se obtiene (http://ideone.com/AFHoHC):

    ZOË SALDAÑA JUGADOS EN LA MALDICIÓN DEL PADRE CARDONA.

    Si no funciona, tendrá que cambiar (*) en std::locale::global(std::locale("en_US.UTF8")); o UTF-8 configuración regional de la que realmente tiene en la plataforma.

    • Esto es, si su stdlib tiene soporte local, y su localización UTF-8 se denomina «en_US.UTF8». Es una buena C++ solución, pero que C++ solución es en sí mismo bastante transportables.
    • Sí, por supuesto, usted tiene que comprobar si la localización UTF-8 existe. En realidad no lo std::locale::global(std::locale("")) a hacer el trabajo?
    • Este código funciona si puedo configurar el std::locale::global(std::locale(«en_US.UTF-8»)); en la Manzana LLVM 4.2 Compilador, pero no en LLVM compilador GCC 4.2. Creo que ‘auto’ no se admite en LLVM GCC.
    • Wow, eso es un compilador antiguo! Intente reemplazar auto& con const std::ctype<wchar_t>&.
  2. 4

    He encontrado 2 solución de que problem_

    1.
    setlocale(LC_CTYPE, «es_es.UTF-8»); //el regional será el UTF-8 habilitado inglés

    std::wstring str = L"Zoë Saldaña played in La maldición del padre Cardona.ëèñ";
    
    std::wcout << str << std::endl;
    
    for (wstring::iterator it = str.begin(); it != str.end(); ++it)
        *it = towupper(*it);
    
    std::wcout << "toUpper_onGCC_LLVM_1 :: "<< str << std::endl;

    este está trabajando en LLVM Compilador GCC 4.2.

    2.
    std::locale::global(std::locale(«en_US.UTF-8»)); //el regional será el UTF-8 habilitado inglés

    std::wcout.imbue(std::locale());
    const std::ctype<wchar_t>& f = std::use_facet< std::ctype<wchar_t> >(std::locale());
    
    std::wstring str = L"Chloëè";//"Zoë Saldaña played in La maldición del padre Cardona.";
    
    f.toupper(&str[0], &str[0] + str.size());   
    
    std::wcout << str << std::endl;

    Esto está trabajando en Apple LLVM 4.2.

    Ambos caso me encontré en Xocde.
    Pero me estoy encontrando una manera de ejecutar este código en Eclipse con el Compilador g++.

    • Has leído las otras respuestas? Básicamente copia/pega @mewa y mi respuesta…
  3. 3

    Con bastante dificultad, si vas a hacerlo bien.

    La costumbre de caso de uso para esto es para fines de comparación, pero el problema es más general que la que.

    Hay una bastante detallada del papel de C++ Informe circa 2000 de Matt Austern aquí (PDF)

    • Poner en mayúsculas por minúsculas comparación es sólo el enfoque equivocado. El enfoque correcto es deshacerse solo de las diferencias entre mayúsculas y minúsculas (no hay una operación conocida como «casefolding» que puede ser usado para esto) y luego comparar. Poner en mayúsculas no deshacerse de solo en el caso de las diferencias.
    • Yo incluso en desacuerdo con esa afirmación. Usted quiere deshacerse de todas las diferencias que son irrelevantes para la comparación. Seguro, Æ = æ, pero que probablemente es igual a AE, ae y AE así.
    • Esta no es una respuesta
  4. 2

    Conjunto de la configuración regional de primera, ejemplo :

    setlocale(LC_ALL, "German")); /*This won't work as per comments below */
    
    setlocale(LC_ALL, "English"));
    
    setlocale( LC_MONETARY, "French" );
    
    setlocale( LC_ALL, "" ); //default locale 

    A continuación, utilizar

    std::use_facet std::locale de la siguiente manera:-

    typedef std::string::value_type char_t;
    char_t upcase( char_t ch )
    {
     return std::use_facet< std::ctype< char_t > >( std::locale() ).toupper( ch );
    }
    
    std::string toupper( const std::string &src )
    {
     std::string result;
     std::transform( src.begin(), src.end(), std::back_inserter( result ), upcase );
     return result;
    }
    
    const std::string src  = "Hello World!";
    std::cout << toupper( src );
    • Curioso que se mencione el alemán configuración regional y, a continuación, proceder a la utilización de un método que no funciona para la correcta alemán poner en mayúsculas, porque utiliza un 1-a-1 mapa (transform), pero poner en mayúsculas ß resultados en dos personajes.
    • ahh, idk 😀 actualizado, gracias
    • En realidad quiero convertir texto en francés, así que estoy usando setlocale( LC_MONETARY, «el francés» ); Pero llegar CHLOë como de salida, cuando me la conversión de chloë a la parte superior de la caja.
    • por favor, por favor, por favor, dejar de programación por accidente. ¿Qué piensa usted setlocale(LC_MONETARY, "French") hace? ¿Crees que poner en mayúsculas «Chloë» tiene monetaria preocupaciones en ella? Si tu problema es encontrar la documentación, es aquí en.cppreference.com/w/cpp/locale/setlocale aquí en.cppreference.com/w/cpp/locale/LC_categories
    • lo que quieren exactamente de «Chloë ? por favor déjala en paz 😉
    • Cholë debe venir como CHOLË después de cambiar a mayúsculas.

  5. 2

    En Windows, considere la posibilidad de CharUpperBuffW y CharLowerBuffW de lenguaje mixto aplicaciones donde la configuración regional es desconocido. Estas funciones manejar los signos diacríticos donde toupper() no.

    • Sólo hay desventajas para el uso de la plataforma de funciones específicas para la manipulación de texto — que se une el código para esa plataforma, y no le hace ningún bien. Teniendo en cuenta que hay muchos buenos manipulación de texto bibliotecas que no son específicas de la plataforma, sólo te estás perjudicando a ti mismo haciendo esto.
    • Es ingenuo suponer que es beneficioso o rentable para ejecutar todas las aplicaciones en todas las plataformas.
    • Es ingenuo suponer que su programa no se ejecutará en cualquier otra plataforma que el que está en desarrollo ahora mismo. Es francamente estúpido ate a una plataforma mediante el uso de un inferior de la API, cuando un superior no específicas de la plataforma API existe.
  6. 1

    Si quieres una sana y madura solución, mira IBM ICU. He aquí un ejemplo:

    #include <iostream>
    #include <unicode/unistr.h>
    #include <string>
    
    int main(){
        icu::UnicodeString us("óóßChloë");
        us.toUpper(); //convert to uppercase in-place
        std::string s;
        us.toUTF8String(s);
        std::cout<<"Upper: "<<s<<"\n";
    
        us.toLower(); //convert to lowercase in-place
        s.clear();
        us.toUTF8String(s);
        std::cout<<"Lower: "<<s<<"\n";
        return 0;
    }

    De salida:

    Upper: ÓÓSSCHLOË
    Lower: óósschloë

    Nota: En el paso posterior SS no está siendo tratada como capital de alemán ß

    • Que se ve como una buena biblioteca. Sin embargo, relojes en casi 30MB. Toda mi app es 21MB.
  7. 0

    Para C me gustaría utilizar toupper después de ajustar la localización C en el subproceso actual.

    setlocale(LC_CTYPE, "en_US.UTF8");

    Para C++ me gustaría utilizar el toupper método de std::ctype<char>:

    std::locale loc;
    
    auto& f = std::use_facet<std::ctype<char>>(loc);
    
    char str[80] = "Hello World";
    
    f.toupper(str, str+strlen(str));
    • mi código es:- setlocale(LC_CTYPE, «es_es.UTF8»); std::locale loc; auto& f = std::use_facet<std::ctype<char>>(loc); char str[80] = «pièces»; f.toupper(str, str+strlen(cadena)); cout<<str; pero estoy recibiendo de salida de as – PIèCES
    • eso es porque la configuración regional es_es no tiene mayúsculas formas para algo que no está en la a-z.
    • Entonces, ¿qué tengo que hacer para que,en realidad, soy muy nuevo en CPP y yo aún no sé hello world programa correctamente en el CPP. de alguna forma me la gestión que..
    • Utilizar el idioma apropiado. Por ejemplo, en turco, mayúsculas de i es I (manteniendo el punto por encima). La configuración regional turca sabe esto, sabe que i mayúscula es que sin un punto. Ambos tienen razón, por supuesto.
    • Te equivocas, mira mi respuesta…
    • ah, me olvidaba de cómo Pankaj fue el uso de cout para imprimir cosas. Buen punto.
    • entonces, ¿qué es setlocale(LC_CTYPE, «es_es.UTF8»); configuración regional de turco, a continuación, por favor?
    • Probablemente "tr_TR.UTF8".

Dejar respuesta

Please enter your comment!
Please enter your name here