Помогите с функциями CString - MakeUpper() и MakeLower()...
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Доброго времени суток! Неожиданно столкнулся с такой проблемой: функции класса CString
MakeUpper() и MakeLower() почему-то не работают с русскими буквами (с англ. все норм). например
CString str = _T("АБВГД");
str.MakeLower(); // и ничего не происходит
а если написать английскими буквами:
CString str = _T("ABCDE");
ASSERT(str.MakeLower() == _T("abcde")) // всё нормально
Может кто-нибудь что-то сказать по этому поводу?
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" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Если установить локаль вызовом setlocale(LC_ALL,"rus"); , то данные функции начинают работать нормально.
Я когда-то делал подобную вещь. Для кодовой страницы Windows-1251 всё довольно просто: чтобы из заглавной буквы сделать строчную, нужно код её символа увеличить на 32. Чтобы из строчной заглавную сделать - соответственно уменьшить код символа на 32. С кодировкой MS-DOS 866 немного сложнее: там русский алфавит как бы "разорван" на части, поэтому потребуются дополнительные условия.
Большое спасибо за ответы! Попробую каждое из предложенного.
Странно. У меня на MS Visual Studio 6.0 MakeUpper отлично отрабатывает для русских букв.
В тексте сообщения выводися: АБВГДЭЮЯ
Код: Выделить всё
BOOL CTST_MFCDIALOGDlg::OnInitDialog()
{
................
CString csTest;
csTest = "АбВгДэЮя";
csTest.MakeUpper ();
MessageBox (csTest, csTest, MB_OK);
};
А я работаю в 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;
}
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;
}
ВВВ, попробуй скомпилировать с использованием UNICODE.BBB писал(а):Странно. У меня на MS Visual Studio 6.0 MakeUpper отлично отрабатывает для русских букв.
А установка локали не помогла?Artur_87 писал(а):А я работаю в Visual Studio 2008 Professional Edition... пришлось написать эти функции самому=)
Код: Выделить всё
#include "locale"
setlocale(LC_ALL,"rus");
//.................................
CString s(_T("ЁКЛМН_SDFGJWQ"));
s.MakeLower();