2008-08-14 2 views
23

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

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

+3

Помните, что текущее решение не совместимо с Unicode. – sorin 2010-03-08 15:57:46

ответ

26
#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

+1

Вы должны сказать, что нужно использовать #include использовать преобразование – c0m4 2008-12-04 12:14:56

+7

Я думаю, что лучше использовать «тупые кавычки» в таком примере строкового литерала, а не «умные кавычки». Это делает его лучше с точки зрения копирования-вставки-компиляции. – 2010-01-19 08:58:23

+3

Как это работает для строк, отличных от ASCII? – Nikolai 2013-09-12 17:40:09

4

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

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

2

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

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

20
> 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)); 
0

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

6

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

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)); 
1

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

#include <locale.h> 

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

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

Настройка локаль NULL не работает ...

1

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