Отправляет email-рассылки с помощью сервиса Sendsay

[prg] C++ tolower не переводит кирилицу в нижний регистр

Здравствуйте, уважаемые!

Приходится огромное количество документации читать на английском, по этому,
видимо, где-то мог упустить из виду особенности использования метода
tolower. Вот код, который преобразует аббревиатуру из латинских символов в
нижний регистр и не преобразует из кирилических:

#include <string> // std::string

#include <locale> // std::locale, std::tolower

#include <fstream>

using namespace std;

int main () {

ofstream out("out.txt");

locale loc;

string str="IBM, ГТО\n";

for (string::size_type i=0; i<str.length(); ++i)

out << tolower(str[i],loc);

return 0;

}

Может ли этот метод перевести кирилические символы в нижний регистр? Если
да, то как?

Администратор Самарского голосового чата,
Самарского сервера LKF-книг
Грызунов Александр Викторович.

Ответить   Tue, 1 Apr 2014 13:34:39 +0400 (#2991200)

 

Ответы:

Приветствую всех.

...
Имеет смысл ещё и почитать документацию по std::locale.

Может, если вы установите соответствующую локаль. По умолчанию в коде
пролога программ на C/C++ устанавливается локаль "C", в которой нет
кириллических букв как понятия.
Вам нужно установить кодовую страницу, соответствующую тем строкам, которые
вы собираетесь преобразовывать (и еще принять во внимание, что консольное
окно Windows использует кодовую страницу 866, а GUI-приложения -- кодовую
страницу 1251).
Для ОС Windows и кодовой страницы 1251 (в которой, скорее всего, написан ваш
код), вместо вышеприведённой строки, можно попробовать поставить эту:
locale loc("russian_russia.1251");
...

Ответить   "i_chay" Tue, 1 Apr 2014 18:00:53 +0300 (#2991457)

 

Vande omentaina, "i_chay"!

А разве не UTF-8? Всё ещё Win-1251?

Ответить   Menelion Elensuule Tue, 1 Apr 2014 18:53:11 +0300 (#2991707)

 

Приветствую всех.

Вопрос и пример касались однобайтовых кодировок.
В Windows API (сюда же входит API для работы с GUI-элементами) функции,
принимающие символьные последовательности в качестве аргументов,
присутствуют в двух вариантах: для однобайтовых последовательностей и для
широкосимвольных последовательностей.
Во втором случае -- это utf-16le (ещё с прошлого века).

Ответить   "i_chay" Tue, 1 Apr 2014 22:19:18 +0300 (#2991726)

 

Vande omentaina, "i_chay"!

А разве не UTF-8? Всё ещё Win-1251?

Ответить   Menelion Elensuule Tue, 1 Apr 2014 18:53:11 +0300 (#2992606)