Строка в нижний / верхний в C ++ - PullRequest
24 голосов
/ 14 августа 2008

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

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

Ответы [ 9 ]

27 голосов
/ 14 августа 2008
#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

20 голосов
/ 22 августа 2008
> 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));
6 голосов
/ 12 ноября 2009

Для копировщиков, желающих использовать ответ Ник Стронга, обратите внимание на орфографическую ошибку в "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 голосов
/ 17 августа 2008

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

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

2 голосов
/ 02 декабря 2010

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

2 голосов
/ 17 августа 2008

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

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

1 голос
/ 27 января 2014

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

1 голос
/ 01 марта 2013

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

#include <locale.h>

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

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

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

0 голосов
/ 26 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...