Сведения о вопросе

krutoi

04:42, 23rd August, 2020

Теги

c++   string   unicode    

Строка для нижнего / верхнего уровня в C++

Просмотров: 414   Ответов: 6

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

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



  Сведения об ответе

KOMP

09:16, 25th August, 2020

#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


  Сведения об ответе

dump

21:06, 1st October, 2020

> std::string data = “Abc”; 
> std::transform(data.begin(), data.end(), data.begin(), ::toupper);

Это будет работать, но при этом будет использоваться стандартный "C" locale. Вы можете использовать фасеты, если вам нужно получить tolower для другого locale. Приведенный выше код, использующий фасеты, был бы:

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


  Сведения об ответе

DINO

15:13, 17th August, 2020

Для копипастеров, которые надеются использовать ответ 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));


  Сведения об ответе

#hash

01:30, 1st August, 2020

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

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


  Сведения об ответе

ASER

17:04, 20th August, 2020

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


  Сведения об ответе

#hash

06:44, 27th August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться