Перевод строки в Нижний / Верхний регистр в C ++

StackOverflow https://stackoverflow.com/questions/11491

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

Для копипастеров, надеющихся использовать ответ Ника Стронга, обратите внимание на орфографическую ошибку в "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 / C ++ не были созданы для обработки данных в Юникоде, поэтому вам придется обратиться к другим библиотекам.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top