Страница 1 из 1

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

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

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

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

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


Может кто-нибудь что-то сказать по этому поводу?

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

Добавлено: 25 фев 2011, 11:13
Romeo
Ничего здесь не поделать. Только написать свой MakeLower. Функция MakeLower класса CString работает только с английскими буквами.

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

Добавлено: 25 фев 2011, 16:10
Albor
Если установить локаль вызовом setlocale(LC_ALL,"rus"); , то данные функции начинают работать нормально.

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

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

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

Добавлено: 27 фев 2011, 12:33
Artur_87
Большое спасибо за ответы! Попробую каждое из предложенного.

Re:

Добавлено: 01 мар 2011, 11:05
BBB
Странно. У меня на MS Visual Studio 6.0 MakeUpper отлично отрабатывает для русских букв.

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

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

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

        MessageBox (csTest, csTest, MB_OK);
};
В тексте сообщения выводися: АБВГДЭЮЯ

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

Добавлено: 01 мар 2011, 15:00
Artur_87
А я работаю в 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;
}

Re:

Добавлено: 01 мар 2011, 15:42
Albor
BBB писал(а):Странно. У меня на MS Visual Studio 6.0 MakeUpper отлично отрабатывает для русских букв.
ВВВ, попробуй скомпилировать с использованием UNICODE.

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

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

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

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