Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> смена регистра русс слова в string, как быть? если что-то подобное для русск 
V
    Опции темы
Syberex
Дата 16.2.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



у меня есть две функции которые прекрастно справляются с английскими словами, а вот как быть с русскими? что то на подобе есть?
Код

#include "string"
using namespace std;
using std::string;      
using std::size_t;
using std::tolower;
using std::toupper;

 //создание копии в верхнем регистре
  string upperCase(const string& s)
  {
      string upper(s);
      for(size_t i=0;i<s.length();++i)
      upper[i]=toupper(upper[i]);
      return upper;
  }

  
  //создание копии в нижнем регистре
  string lowerCase(const string& s)
  {
      string lower(s);
      for(size_t i=0; i<s.length(); ++i)
      lower[i]=tolower(lower[i]);
      return lower;
  }


если не затруднит, скинте примерчик
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
SerpentVV
Дата 16.2.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 27.11.2006
Где: Астрахань

Репутация: 1
Всего: 1



C русскими - одна большая проблема...
Нужно копать в сторону locale, но сам я пока не копал...
Ищи материал по теме "локализация приложений"...

PM MAIL   Вверх
Fazil6
Дата 16.2.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Код

#include <locale>
#include <iostream>

#include <windows.h>

int main( )   
{
    std::locale loc1 ( "Rus_Rus" );

    char string[] = "Превед!";

    std::use_facet<std::ctype<char> > ( loc1 ).toupper
        ( &string[0], &string[strlen(&string[0])-1] );

    ::MessageBox(0,string,0,0);
    return 0;
}



Это сообщение отредактировал(а) Fazil6 - 16.2.2007, 13:58
PM MAIL   Вверх
Syberex
Дата 16.2.2007, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



это конечно всё хорошо, но тут используется char а не string, нужно 

string word; // тут находится слово русское
  и оно корректо выводится вот так cout<<word<<endl;  т.е слово я не набирал в среде отладки а считал его из файла, мне необходимо моё слово типа string преобразовать в нижний и вверхний регистр
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
apook
Дата 16.2.2007, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Не знаю такой проблемы tolower(); и все тут 
string char одна хрень tolower(здесь символ) как взять символ
из массива знаешь !


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Syberex
Дата 16.2.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



она не хочет обрабатывать русские символы
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Fazil6
Дата 16.2.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Код

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

#include <windows.h>

int main( )   
{
    std::locale loc1 ( "Rus_Rus" );

    std::string word("превед!");
    std::string res;

    std::string::iterator i = word.begin();
    while (i != word.end())
    {
        res.push_back(std::use_facet< std::ctype<char> > (loc1).toupper( *i));
        ++i;
    }

    ::MessageBox(0,res.c_str(),0,0);
    return 0;
}

PM MAIL   Вверх
Syberex
Дата 16.2.2007, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет





компилит чудестно, а потом выкидывает в ошибку на этой строке

к
Код

std::locale loc1 ( "Rus_Rus" );

--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
Fazil6
Дата 16.2.2007, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



ну попробуй так
Код

std::locale loc1 ("Russian_Russia.1251");

PM MAIL   Вверх
chaos
Дата 16.2.2007, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



вот так на вскидку извратился smile

Код

class CConvert
{
    locale m_loc;
    const ctype<char> &m_fac;

    class L2U
    {
        const ctype<char> &m_fac;
    public:
        L2U (const ctype<char> &fac):m_fac(fac) {}

        char operator()(char ch)
        { return m_fac.toupper(ch); }
    };

public:
    CConvert(const char *lpszLocale) : 
        m_loc(lpszLocale)
        , m_fac(use_facet<ctype<char> >(m_loc)) 
    {}

    string l2u(string soStr)
    {
        string soVal;
        transform(soStr.begin(), soStr.end(), back_inserter(soVal), L2U(m_fac));
        return soVal;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    char *s = "Превед Медвед";
    CConvert oConv("Rus_Rus");
    cout << oConv.l2u(s).c_str() << endl;

    return 0;
}


думаю можно сократить очень сильно если заюзать unary_function
PM WWW   Вверх
Syberex
Дата 16.2.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 208
Регистрация: 15.9.2006
Где: Украина

Репутация: нет
Всего: нет



сечас в ошибку не вылетает, но и выводит иероглифы какието
--------------------
whole power in artificial intelligences
PM MAIL ICQ   Вверх
chaos
Дата 16.2.2007, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Syberex, только не задавай вопрос про кодировку smile стопятьсот раз тема подымалась.

можешь просто в начала программы написать 
Код

#ifdef _DEBUG
system("chcp 1251");
#endif


Добавлено @ 16:52 
так мне больше нравиться, такой фрэймворк для работы со строчками%)

Код

//StringFrameWork.h
class CStringFrameWork
{
    locale m_loc;
    const ctype<char> &m_fac;

public:
    CStringFrameWork(const char *lpszLocale);
    string l2u(string soStr);
    string u2l(string soStr);
};

//StringFrameWork.cpp
CStringFrameWork::CStringFrameWork(const char *lpszLocale) : 
      m_loc(lpszLocale)
    , m_fac(use_facet<ctype<char> >(m_loc)) 
{}

string CStringFrameWork::l2u(string soStr)
{
    string soVal(soStr);
    for (size_t n = 0; n < soStr.length(); n++)
        soVal[n] = m_fac.toupper(soStr[n]);

    return soVal;
}

string CStringFrameWork::u2l(string soStr)
{
    string soVal(soStr);
    for (size_t n = 0; n < soStr.length(); n++)
        soVal[n] = m_fac.tolower(soStr[n]);

    return soVal;
}


//main.cpp
int _tmain(int argc, _TCHAR* argv[])
{
    char *s = "Превед Медвед";
    CStringFrameWork oConv("Rus_Rus");
    cout << oConv.l2u(s).c_str() << endl;
    cout << oConv.u2l(s).c_str() << endl;
    
    return 0;
}




PM WWW   Вверх
W4FhLF
Дата 16.2.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Для смены регистра символа в ASCII достаточно инвертировать 5ый бит. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
V.A.KeRneL
  Дата 17.2.2007, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 1
Всего: 14



Цитата(W4FhLF @  16.2.2007, 17:13 Найти цитируемый пост)

Для смены регистра символа в ASCII достаточно инвертировать 5ый бит.

W4FhLF, дык для русского ж текста просят, а не для стандартной ASCII (с ней-то проблем никаких нету)...


Это сообщение отредактировал(а) V.A.KeRneL - 17.2.2007, 13:32


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
W4FhLF
Дата 17.2.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



V.A.KeRneL, ну у меня и на русских работает. По-крайней мере в WIN кодировке.

Код

    for (int i = 0; i < lstrlen(str); i++)
        str[i] |= 0x20;



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.