Каков наилучший способ, которым люди обнаружили, что для String используется нижний регистр/верхний регистр в С++?
Проблема осложняется тем, что С++ не является языком программирования на английском языке. Есть ли хороший многоязычный метод?
Каков наилучший способ, которым люди обнаружили, что для String используется нижний регистр/верхний регистр в С++?
Проблема осложняется тем, что С++ не является языком программирования на английском языке. Есть ли хороший многоязычный метод?
#include <algorithm>
std::string data = "Abc";
std::transform(data.begin(), data.end(), data.begin(), ::toupper);
http://notfaq.wordpress.com/2007/08/04/cc-convert-string-to-upperlower-case/
Кроме того, статья CodeProject для общих строковых методов: http://www.codeproject.com/KB/stl/STL_string_util.aspx
> 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));
Для копировальных аппаратов, надеющихся использовать ответ 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));
Вы также должны рассмотреть этот вопрос. В основном проблема заключается в том, что стандартные библиотеки C/С++ не были созданы для обработки данных Unicode, поэтому вам придется искать другие библиотеки.
Это может измениться по мере обновления стандарта С++. Я знаю, что следующий компилятор из Borland (CodeGear) будет иметь поддержку Unicode, и я бы предположил, что компилятор Microsoft С++ будет иметь или уже имеет строковые библиотеки, поддерживающие Unicode.
Как сказал вам Даррен, самым простым способом является использование std:: transform.
Но будьте осторожны с тем, что на каком-то языке, например, на немецком языке, между нижним и верхним регистром не всегда есть одно к одному. Шестнадцатеричный символ "esset" (похожий на бета-версию греческого персонажа) преобразуется в "SS" в верхнем регистре.
Если у вас есть Boost, то он имеет самый простой способ. Посмотрите to_upper()/to_lower() в алгоритмах строковой строки.
Я нашел способ конвертировать случай символов unicode (и многоязычных), но вам нужно знать/находить (каким-то образом) локаль символа:
#include <locale.h>
_locale_t locale = _create_locale(LC_CTYPE, "Greek");
AfxMessageBox((CString)""+(TCHAR)_totupper_l(_T('α'), locale));
_free_locale(locale);
Я еще не нашел способ сделать это... Я знаю, как, дайте мне знать.
Установка языкового стандарта в NULL не работает...
VCL
имеет SysUtils.hpp
, который имеет LowerCase(unicodeStringVar)
и UpperCase(unicodeStringVar)
, который может сработать для вас. Я использую это в С++ Builder 2009.
Что Стив говорит правильно, но я предполагаю, что если ваш код должен был поддерживать несколько языков, вы могли бы использовать метод factory, который инкапсулирует набор методов, которые делают соответствующие toUpper или toLower на основе этого языка.