Строка в нижний / верхний в C ++

Как люди нашли лучший способ сделать строку в нижний регистр / верхний регистр в C ++?

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

14.08.2008 18:49:47
Имейте в виду, что текущее решение не совместимо с Юникодом.
sorin 8.03.2010 15:57:46
9 ОТВЕТОВ
РЕШЕНИЕ
#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

31
19.05.2013 18:32:57
Вы должны сказать, что нужно #include <алгоритм>, чтобы использовать преобразование
c0m4 4.12.2008 12:14:56
Я думаю, что лучше использовать «тупые кавычки» в таком примере строкового литерала, а не «умные кавычки». Это делает его лучше с точки зрения копирования-вставки-компиляции.
Ron Klein 19.01.2010 08:58:23

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

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

4
23.05.2017 11:45:33

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

Но имейте в виду, что в некоторых языках, например, в немецком, не всегда существует соотношение один к одному между строчными и прописными буквами. Строчный символ «esset» (похожий на греческий бета-символ) преобразуется в «SS» в верхнем регистре.

2
17.08.2008 13:30:59
> 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));
20
10.03.2010 03:12:00

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

0
26.08.2008 18:58:13

Для тех, кто копирует копии и надеется использовать ответ Ник Стронга, обратите внимание на орфографическую ошибку в «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));
6
12.11.2009 19:02:13
Спасибо Hexetic, похоже, что GMan очистил это для нас :)
Nic Strong 10.03.2010 08:30:26

Если у вас есть Boost, то у него самый простой способ. Посмотрите на to_upper () / to_lower () в строковых алгоритмах Boost .

2
2.12.2010 14:40:00

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

#include <locale.h>

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

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

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

1
1.03.2013 05:39:33

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

1
27.01.2014 17:40:20