Преобразование строки Unicode в С++ в верхний регистр

Как мы можем преобразовать строку нескольких языков или строку unicode в верхний/нижний регистр в C или С++.

Ответы

Ответ 1

Если ваша система уже находится в UTF-8, используя std::use_facet, вы можете написать:

#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;
}

И вы получите (http://ideone.com/AFHoHC):

ZOË SALDAÑA ИГРАЕТ В LA MALDICIÓN DEL PADRE CARDONA.

Если это не сработает, вам придется изменить (*) на std::locale::global(std::locale("en_US.UTF8")); или локаль UTF-8, которую вы на самом деле имеете на форме.

Ответ 2

Я нашел 2 решения этой проблемы _

1. setlocale (LC_CTYPE, "en_US.UTF-8" );//locale будет отображаться в режиме UTF-8.

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;

работает над компилятором LLVM GCC 4.2.

2. станд:: локаль:: глобальный (станд:: локаль ( "en_US.UTF-8" ));//locale будет отображаться в режиме UTF-8.

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;

Это работает в Apple LLVM 4.2.

Оба случая я побежал на Xocde. Но я нахожу способ запустить этот код в Eclipse с компилятором g++.

Ответ 3

С довольно большой трудностью, если вы сделаете это правильно.

Обычный прецедент для этого предназначен для сравнения, но проблема более общая.

Существует довольно подробная статья из отчета С++ около 2000 года от Matt Austern здесь (PDF)

Ответ 4

Установите сначала локаль, например:

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 

Затем используйте

std:: use_facet std:: locale как следующим образом: -

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 );

Ответ 5

В Windows рассмотрите CharUpperBuffW и CharLowerBuffW для приложений на смешанном языке, где локаль неизвестна. Эти функции обрабатывают диакритические знаки, где toupper() нет.

Ответ 6

Вы можете выполнить итерацию через wstring и использовать towupper/towlower

for (wstring::iterator it = a.begin(); it != a.end(); ++it)
        *it = towupper(*it);

Ответ 7

Если вы хотите разумное и зрелое решение, посмотрите IBM ICU. Вот пример:

#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;
}

Вывод:

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

Примечание: На следующем этапе SS не рассматривается как капитал немецкого ß

Ответ 8

Для C я бы использовал toupper после настройки локали C в текущем потоке.

setlocale(LC_CTYPE, "en_US.UTF8");

В С++ я бы использовал метод toupper 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));