2017-02-03 20 views
2

wstringを小文字に変換したいと思います。私は、ロケール情報を使用して多くの答えがあることがわかりました。 wstringについてもToLower()のような機能はありますか?wstringを小文字に変換する

+2

http://en.cppreference.com/w/cpp/string/wide/towlower –

+0

"小文字"は本質的にロケール固有の操作であることに注意してください。トルコでは、 'towlower('I'L)!='I'L'(結果は実際に' 'ı'') –

+1

実際、ケース変換は悪夢です。小文字の「Σ」は単語の位置によって「σ」と「ς」のいずれかであり、小文字の「SS」はドイツ語では「ß」または「ss」です。 MASSE "はホモグラフに応じて"Maße "または" masse "のいずれかです。詳細については、http://unicode.org/faq/casemap_charprop.htmlを参照してください。 –

答えて

3

std::towlowerは、希望する機能です。<cwtype>です。このヘッダーには、ワイド文字列を処理するための多くの関数が含まれています。

例:

// Convert wstring to upper case 
wstring wstrTest = L"I am a STL wstring"; 
transform(
    wstrTest.begin(), wstrTest.end(), 
    wstrTest.begin(), 
    towlower); 
+1

これは、複数のコードユニットにまたがるコードポイントでは正しく動作しないと思います。 – user2079303

+0

@ user2079303 C++(ここではC)では、サポートされているコード・ポイントがwchar_tに収まる必要があります。言い換えれば、これはWindows上の問題にすぎません。 (実際の問​​題は、コードポイントでは1:1ではなく、文脈依存であるということです) – Cubbi

+0

@Cubbi Windowsの問題は、多くのクロスプラットフォームプログラムには問題です:)しかし、そうです、それは確かです一度に1つのコード単位を変換することができない唯一の理由ではありません。マッピングアルゴリズムは文字列全体を正しく処理する必要があります。 – user2079303

1

希望に役立ちます。..

#include <iostream> 
#include <algorithm> 

int main() 
{ 

std::wstring str = L"THIS TEXT!"; 
std::wcout << "Lowercase of the string '" << str << "' is "; 
std::transform(str.begin(), str.end(), str.begin(), ::tolower); 
std::wcout << "'" << str << "'\n"; 

return 0; 
} 

出力:

Lowercase of the string 'THIS TEXT!' is 'this text!' 
+0

このメソッドでうまく動作するta – Epirocks

関連する問題