Страница 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(), позволяющая произвести корректное сравнение, используя национальные особенности.