web-dev-qa-db-ja.com

C ++のUnicode文字列を大文字に変換する

多言語文字列またはUnicode文字列をCまたはC++で大文字/小文字に変換する方法。

17
Pankaj

システムがすでに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ロケールに変更する必要がありますプレートフォーム。

11
Kyle_the_hacker

私はその問題の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 ++コンパイラを使用して実行する方法を見つけています。

4
Pankaj

あなたがそれを正しくやろうとしているなら、かなりの困難を伴います。

これの通常のユースケースは比較を目的としていますが、問題はそれよりも一般的です。

MattAusternによる2000年頃のC++レポートからのかなり詳細な論文があります ここ (PDF)

3
SteveLove

Windowsでは、ロケールが不明な混合言語アプリケーションの場合はCharUpperBuffWCharLowerBuffWを検討してください。これらの関数は、toupper()が処理しない発音区別符号を処理します。

2
Pierre

ロケールファースト を設定します。例:

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

正気で成熟したソリューションが必要な場合は、 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はドイツ語の首都として扱われていませんß

1
Jahid

wstringを反復処理して、 towupper / towlower を使用できます。

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

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