Подтвердить что ты не робот

String To Lower/Upper в С++

Каков наилучший способ, которым люди обнаружили, что для String используется нижний регистр/верхний регистр в С++?

Проблема осложняется тем, что С++ не является языком программирования на английском языке. Есть ли хороший многоязычный метод?

4b9b3361

Ответ 2

> std::string data = "Abc"; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);

Это будет работать, но это будет использовать стандартную локалью "C". Вы можете использовать грани, если вам нужно получить tolower для другого языкового стандарта. Вышеприведенный код с использованием граней:

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

Ответ 3

Для копировальных аппаратов, надеющихся использовать ответ Nic Strong, обратите внимание на орфографическую ошибку в "use_factet" и отсутствующий третий параметр на std:: transform:

locale loc("");
const ctype<char>& ct = use_factet<ctype<char> >(loc);
transform(str.begin(), str.end(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

должен быть

locale loc("");
const ctype<char>& ct = use_facet<ctype<char> >(loc);
transform(str.begin(), str.end(), str.begin(), std::bind1st(std::mem_fun(&ctype<char>::tolower), &ct));

Ответ 4

Вы также должны рассмотреть этот вопрос. В основном проблема заключается в том, что стандартные библиотеки C/С++ не были созданы для обработки данных Unicode, поэтому вам придется искать другие библиотеки.

Это может измениться по мере обновления стандарта С++. Я знаю, что следующий компилятор из Borland (CodeGear) будет иметь поддержку Unicode, и я бы предположил, что компилятор Microsoft С++ будет иметь или уже имеет строковые библиотеки, поддерживающие Unicode.

Ответ 5

Как сказал вам Даррен, самым простым способом является использование std:: transform.

Но будьте осторожны с тем, что на каком-то языке, например, на немецком языке, между нижним и верхним регистром не всегда есть одно к одному. Шестнадцатеричный символ "esset" (похожий на бета-версию греческого персонажа) преобразуется в "SS" в верхнем регистре.

Ответ 7

Я нашел способ конвертировать случай символов unicode (и многоязычных), но вам нужно знать/находить (каким-то образом) локаль символа:

#include <locale.h>

_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);

Я еще не нашел способ сделать это... Я знаю, как, дайте мне знать.

Установка языкового стандарта в NULL не работает...

Ответ 8

VCL имеет SysUtils.hpp, который имеет LowerCase(unicodeStringVar) и UpperCase(unicodeStringVar), который может сработать для вас. Я использую это в С++ Builder 2009.

Ответ 9

Что Стив говорит правильно, но я предполагаю, что если ваш код должен был поддерживать несколько языков, вы могли бы использовать метод factory, который инкапсулирует набор методов, которые делают соответствующие toUpper или toLower на основе этого языка.