Re: Нужны русские варианты upper/lower
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 21.02.03 16:26
Оценка:
Здравствуйте, ShootNick, Вы писали:

SN>Может кто-то написал функции toupper, tolower с поддержкой русских кодировок?

SN>Поделитесь пожалуйста. Поиск по форуму облазил, интернет — не нашел. Нужно не только для прямого преобразования в upper/lower но и для использования в регистро-независимом поиске и т.п. Поделитесь пожалуйста. А то setlocale с 866 никак не работает Наверное что-то напутали они там со стандартами. Спасибо вам!

Вот тут сам решил немного разобраться в этом вопросе и набросал пару примеров.

#include <iostream>
#include <algorithm>
#include <string>
#include <locale>

struct uppercase
{
    uppercase(const std::locale& loc) :
        loc(loc)
    {}
    
    char operator()(const char &c)
    {
        return std::toupper(c, loc);
    }
    
private:
    std::locale loc;
};


int main()
{
    std::string s("строка 866 русский алфавит");
    std::locale loc("rus_rus.866");
    std::transform(s.begin(), s.end(), s.begin(), uppercase(loc));
    std::cout << s;
    
    return 0;
}


или без извращений :
#include <iostream>
#include <string>
#include <locale>

using namespace std;

void string_toupper(string &s, const locale &loc)
{
    for (string::iterator i=s.begin(), j=s.end(); i!=j; ++i)
        *i = toupper(*i, loc);
}

int main()
{
    string s("строка 866 русский алфавит");
    string_toupper(s, locale("rus_rus.866"));
    std::cout << s <<'\n';
    
    return 0;
}


Насчет регистро-независимого поиска тоже есть кое-что. Как оформлю в примерчик, положу.
... << RSDN@Home 1.0 beta 5 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.