Преобразование строки 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));