多言語文字列またはUnicode文字列をCまたはC++で大文字/小文字に変換する方法。
システムがすでに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 )を得る:
LAMALDICIÓNDELPADRECARDONAで演奏されたZOËSALDAÑA。
それが機能しない場合は、(*)をstd::locale::global(std::locale("en_US.UTF8"));
または実際に使用しているUTF-8ロケールに変更する必要がありますプレートフォーム。
私はその問題の2つの解決策を見つけました_
1. setlocale(LC_CTYPE、 "en_US.UTF-8"); //ロケールは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;
これはLLVMGCC4.2コンパイラで動作しています。
2. std :: locale :: global(std :: locale( "en_US.UTF-8")); //ロケールは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 LLVM4.2で機能しています。
どちらの場合も、Xocdeで実行しました。しかし、私はこのコードをEclipseでg ++コンパイラを使用して実行する方法を見つけています。
あなたがそれを正しくやろうとしているなら、かなりの困難を伴います。
これの通常のユースケースは比較を目的としていますが、問題はそれよりも一般的です。
MattAusternによる2000年頃のC++レポートからのかなり詳細な論文があります ここ (PDF)
Windowsでは、ロケールが不明な混合言語アプリケーションの場合はCharUpperBuffW
とCharLowerBuffW
を検討してください。これらの関数は、toupper()
が処理しない発音区別符号を処理します。
ロケールファースト を設定します。例:
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_facetstd :: 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 );
正気で成熟したソリューションが必要な場合は、 IBMのIC を参照してください。次に例を示します。
#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
はドイツ語の首都として扱われていませんß
Cの場合、現在のスレッドでCロケールを調整した後、toupper
を使用します。
setlocale(LC_CTYPE, "en_US.UTF8");
C++の場合、std::ctype<char>
のtoupper
メソッドを使用します。
std::locale loc;
auto& f = std::use_facet<std::ctype<char>>(loc);
char str[80] = "Hello World";
f.toupper(str, str+strlen(str));