Помогите с функциями CString - MakeUpper() и MakeLower()...

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Artur_87
Сообщения: 11
Зарегистрирован: 21 фев 2011, 11:55

Доброго времени суток! Неожиданно столкнулся с такой проблемой: функции класса CString
MakeUpper() и MakeLower() почему-то не работают с русскими буквами (с англ. все норм). например

CString str = _T("АБВГД");
str.MakeLower(); // и ничего не происходит

а если написать английскими буквами:

CString str = _T("ABCDE");
ASSERT(str.MakeLower() == _T("abcde")) // всё нормально


Может кто-нибудь что-то сказать по этому поводу?
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ничего здесь не поделать. Только написать свой MakeLower. Функция MakeLower класса CString работает только с английскими буквами.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Если установить локаль вызовом setlocale(LC_ALL,"rus"); , то данные функции начинают работать нормально.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Я когда-то делал подобную вещь. Для кодовой страницы Windows-1251 всё довольно просто: чтобы из заглавной буквы сделать строчную, нужно код её символа увеличить на 32. Чтобы из строчной заглавную сделать - соответственно уменьшить код символа на 32. С кодировкой MS-DOS 866 немного сложнее: там русский алфавит как бы "разорван" на части, поэтому потребуются дополнительные условия.
Artur_87
Сообщения: 11
Зарегистрирован: 21 фев 2011, 11:55

Большое спасибо за ответы! Попробую каждое из предложенного.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Странно. У меня на MS Visual Studio 6.0 MakeUpper отлично отрабатывает для русских букв.

Код: Выделить всё

BOOL CTST_MFCDIALOGDlg::OnInitDialog()
{
................
        CString csTest;

        csTest = "АбВгДэЮя";
        csTest.MakeUpper ();

        MessageBox (csTest, csTest, MB_OK);
};
В тексте сообщения выводися: АБВГДЭЮЯ
Artur_87
Сообщения: 11
Зарегистрирован: 21 фев 2011, 11:55

А я работаю в Visual Studio 2008 Professional Edition... пришлось написать эти функции самому=)

CString myMakeLower(CString str)
{
_____CString strret=_T("");
_____enum alphabet {eng, rus, no_one};
_____for(int i=0;i<str.GetLength();i++) {
__________int rez;
__________wchar_t ch = static_cast<wchar_t> (str);
__________if (ch>=65L && ch<=90L) rez = eng;
__________if (ch>=1040L && ch<=1071L) rez = rus;
__________if (ch<65L || (ch>90L && ch <1040L) || ch>1071L) rez = no_one;
__________switch (rez) {
_______________case eng: ch+=32; break;
_______________case rus: ch+=32; break;
_______________case no_one: ch=ch; break;
_______________default: break;
__________}
__________strret+=ch;
_____}
_____return strret;
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

BBB писал(а):Странно. У меня на MS Visual Studio 6.0 MakeUpper отлично отрабатывает для русских букв.
ВВВ, попробуй скомпилировать с использованием UNICODE.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

Artur_87 писал(а):А я работаю в Visual Studio 2008 Professional Edition... пришлось написать эти функции самому=)
А установка локали не помогла?

Код: Выделить всё

#include "locale"
setlocale(LC_ALL,"rus");
//.................................
CString s(_T("ЁКЛМН_SDFGJWQ"));
s.MakeLower();
И функции не нужно переписывать. А вот если нужно сравнивать строки, то CString-овский метод Compare будет работать не всегда правильно ( из-за некоторых букв русского алфавита: ё, ъ, э). Но есть функция CompareString(), позволяющая произвести корректное сравнение, используя национальные особенности.
Ответить