2017-02-03 16 views
2

Я хочу преобразовать wstring в нижний регистр. Я обнаружил, что есть много ответов, использующих локальную информацию. Есть ли какая-либо функция, например, ToLower() для wstring?Преобразование 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 для получения дополнительных сведений о gory. –

ответ

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 - проблема для большинства кроссплатформенных программ :) Но да, это действительно не единственная причина, по которой трансформация одного блока кода за раз не может работать. Алгоритм отображения должен иметь дело со строками в целом, чтобы работать правильно. – 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