Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
2 / 2 / 0
Регистрация: 22.09.2010
Сообщений: 8
1

char и cp-866

22.09.2010, 04:49. Показов 2963. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! У меня возникла проблема в диалоговом MFC приложении(VS 2010) следующего рода:
Мое приложение читает память dos-программы, запущенной в dos-boxе:
C++
1
2
3
4
5
char* lpBuffer2 = new char[97];//Буфер для читаемой строки
ZeroMemory(lpBuffer2, 97);
DWORD dwRead = 0;
edtDisplay="";//Переменная типа CString,связана с EditBoxом на форме
ReadProcessMemory(pi.hProcess,reinterpret_cast<LPCVOID>(edtOfset1),lpBuffer2,97,&dwRead);
Читаемая область памяти представляет собой последовательность символов в CP-866 кодировке, это проверено путем просмотра области памяти программой ArtMoney.
Затем мне необходимо отфильтровать прочитанную строку, оставив там только некоторые символы, буквы и цифры, делаю проверку в цикле, заменяя все лишние символы пробелами:
C++
1
2
3
4
5
6
7
8
9
10
11
for(int iz=0;iz<97;iz++)
    {
            
if (     !(
        (lpBuffer2[iz]>=32 && lpBuffer2[iz]<=126) //латинские символы  
        ||(lpBuffer2[iz]>=128 && lpBuffer2[iz]<=207) //русские буквы
                ||(lpBuffer2[iz]>=224 && lpBuffer2[iz]<=252) //русские буквы
      )
) lpBuffer2[iz]=32;
    };
edtDisplay+=lpBuffer2;
В результате русские буквы заменяются пробелами, цифры и символы остаются, т.е. проверка 2 и 3 условия возвращает false. Ставил breakpoint, отладчик показывает в lpBuffer[iz] значение соотвествующее коду символа в CP-866 кодировке. Если убрать цикл, в edtDisplay полностью отобразится строка с русскими буквами, видно как в EditBoxе так и при дальнейшей записи в файл.
Будьте добры, подскажите пожалуйста где ошибка, или хотя-бы намекните, если решение слишком очевидно
P.S. Моя программа не наносит вреда окружающим и не ворует личную информацию.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2010, 04:49
Ответы с готовыми решениями:

Объясните, что означает wcout.imbue( locale( "rus_rus.866" ) ); и wcin.imbue( locale( "rus_rus.866" ) ); ?
Непонятно особенно locale( &quot;rus_rus.866&quot; ).

866
использую BDE для подключения к dbf таблицам, все вроде хорошо тока русский язык отображается как...

Методы Char.IsLower Char.IsUpper Char.IsDigit
Доброго времени суток, месяц назад сделал задание: С помощью перебора всех символов строки,...

Char unsigned char signed char длинна Кааак
Здравствуйте. char l = {0,0}; l = 0xff; Почему, меня, компилятор не посылает куда...

4
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
22.09.2010, 05:15 2
Я че-то не очень понял, что нужно заменять пробелом. Можете сказать, что нужно заменить на пробел?
0
2 / 2 / 0
Регистрация: 22.09.2010
Сообщений: 8
22.09.2010, 05:26  [ТС] 3
Все, что не попадает в диапазоны if-ов, диапазоны указаны в виде кодов символов CP-866. Проще говоря, нужно чтоб прочитанной строке остались только русские/латинские буквы, цифры, и некоторые символы (".", "%", ":", etc.).
Вместо замены пробелами можно просто добавлять lpBuffer2[iz] к edtDisplay, если символ подходит, для нахождения ошибки упростил задачу.
0
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
22.09.2010, 05:46 4
Судя по этой таблице первый диапазон русских букв заканчивается на 175-ом символе (символ "п"). В Вашем коде на 207-ом.
А так вроде обработка символов идет вполне нормально.
Только вот вопрос такой: как EditBox воспринимает строку с кодировкой CP866?
1
2 / 2 / 0
Регистрация: 22.09.2010
Сообщений: 8
22.09.2010, 07:44  [ТС] 5
Спасибо, диапазоны поправил на 32..122, 128..175,224..239, результат тот же. Попробовал подставить диапазоны русских букв из CP1251-не помогло.
В текст бокс выводятся символы, у которых код в 1251 равен коду моей буквы в 866, т.е. допустим я считал байт со значением 141 (0x8d), вместо буквы "Н" из CP-866 он показывает Cyrylic Capital Kje из CP-1251, в принципе мне это не важно, я записываю строку в текстовый файл и при открытии указываю кодировку CP-866, но почему визуал не хочет упорно узнавать русские буквы - загадка.

Добавлено через 32 минуты
Век живи-век учись. Проблема решилась следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
unsigned char* lpBuffer2 = new unsigned char[97];УКАЗЫВАЕМ ЧТО ТИП БЕЗЗНАКОВЫЙ
      ZeroMemory(lpBuffer2, 97);
    DWORD dwRead = 0;
    edtDisplay="";
    ReadProcessMemory(pi.hProcess,reinterpret_cast<LPCVOID>(edtOfset1),lpBuffer2,97,&dwRead);
    
    for(int iz=0;iz<97;iz++)
    {
            
        if (!(
            (lpBuffer2[iz]>=32 && lpBuffer2[iz]<=122) || 
            (lpBuffer2[iz]>=128 && lpBuffer2[iz]<=175) ||
            (lpBuffer2[iz]>=224 && lpBuffer2[iz]<=239) 
          )) lpBuffer2[iz]=32;
        
     char* buffer3=new char[97];
    for(int j=0;j<97;j++)
        buffer3[j]=lpBuffer2[j];УКАЗЫВАЕМ ЧТО ТИП ОБЫЧНЫЙ:)
    edtDisplay+=buffer3;
Выходит, компилятор изначально создал unsigned char, успешно помещал в него русские буквы с кодом 128+, успешно выводил их в текстовое поле(правда в CP1251 кодировке), записывал в файл, но при сравнении без явного указания что тип без знака, не мог правильно произвести сравнение, думая что работает с signed char.
После уточнения типа он вдруг "разучился" добавлять его к CString, для чего пришлось выполнять бессмысленый цикл по "приведению" unsigned char к char(тоже unsigned но без этого слова)
0
22.09.2010, 07:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2010, 07:44
Помогаю со студенческими работами здесь

866=> Windows-кодировка...
Ищу функцию для перевода из DOS кодировки 866 в Windows-кодировку на Си... Может есть у кого??

TStringList и OEM-866
Добрый день. Столкнулся с проблемой разбивки строки по разделителю, используя TStringList. У меня...

Кодировка OEM 866
Доброго времени суток. ђҐЈЁ®* - вот эту лабуду хотелось бы перевести в нормальный вид. Пробовал...

866-MS-DOS to 1251-MS-Windows
&quot;Программа предназначена для перекодировки текстовых файлов из формата кодовой таблицы 866-MS-DOS в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru