2017-02-03 6 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 대부분의 크로스 플랫폼 프로그램에서 윈도우 문제는 문제입니다 :) 그렇습니다. 실제로 그렇습니다. 한 번에 하나의 코드 단위 변환 만 작동하지 않는 유일한 이유는 아닙니다. 매핑 알고리즘은 문자열이 전체적으로 올바르게 작동해야합니다. – 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

이 방법으로 훌륭하게 작동합니다. – Epirocks

관련 문제