Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.67
Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
#1

Набор текста (Не выводятся русские буквы, WideCharToMultiByte) - C++

21.02.2011, 00:24. Просмотров 3805. Ответов 10
Метки нет (Все метки)

Всем добрый день.
Программирую ввод текста в строку, для этого ловлю параметр по WM_CHAR. Но там он возвращаешься в wchar_t, а для вывода текста нужны char.

C++
1
2
3
4
5
6
7
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
  switch( msg )
  {
  case WM_CHAR:
    Gameplay.Type(wParam);
    break;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char wchar2char(const wchar_t ws)
{
  char s;
  WideCharToMultiByte(CP_ACP, 0, &ws, -1, &s, 1, NULL, 0);
  return s;
}
 
void L_Gameplay::Type(WPARAM wParam)
{
  wchar_t ws;
  memcpy(&ws, &wParam, 2);
  char s = wchar2char( ws );
  Interface.Type(s);
}
С английскими буквами все норм, а русские - кракозябры всякие. Перепробовал все варианты первого параметра WideCharToMultiByte - просто разные кракозябры в русском.

Из гугла выцепил два возможных решения:
1) Необходимо преобразовать в кодировку CP1251
2) Все в порядке, просто русские буквы по номерам идут дальше, и нужно использовать тип unsigned char

Помогите пожалуйста разобраться в чем тут дело.

Пробовал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
unsigned char wchar2char(const wchar_t ws)
{
  unsigned char s;
  WideCharToMultiByte(CP_ACP, 0, &ws, -1, &s, 1, NULL, 0);
  return s;
}
 
void L_Gameplay::Type(WPARAM wParam)
{
  wchar_t ws;
  memcpy(&ws, &wParam, 2);
  unsigned char s = wchar2char( ws );
  Interface.Type(s);
}
В итоге

error C2664: 'WideCharToMultiByte' : cannot convert parameter 5 from 'unsigned char *' to 'LPSTR'
Если вообще дело в unsigned char а не чем-то другом =(
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cgsg11
9 / 9 / 2
Регистрация: 09.03.2011
Сообщений: 38
12.06.2011, 22:46     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #2
Думаю спасла бы махинация с нативными <stdio.h> функциями.
типа такого:
C++
1
2
3
4
5
6
7
8
9
#include <stdio.h>
//** some code **
CHAR US_wc2c ( WCHAR wc )
{
  CHAR ch[2];
  
  sprintf(ch, "%C", wc);
  return ch[0]; 
}
Пояснения: %C означает вывод WCHAR, насольо я помню, в обычню чаровскую строку. Правда зависит от установки IDE. Путаница может случиться, например в вижуалке, есл в пропертях проекта не сменить кодировку юникоде на мультибайт. Иначе, сам черт не разберет, когда оно что выводит.
Сори, не могу проверить, ибо Виндоза маст дай и вижуалка померла, причем основательно. Так что если кто проверит и подтвердит - буду рад.

Добавлено через 3 минуты
ПС. Возможно придется воспользоваться установкой локали (<locale.h>).
setlocale(LC_ALL, "Rus"); вызвать в самом начале, в мейне.
Насколько я помню, так.
Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
12.06.2011, 23:40     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #3
1. если работаешь в студии то просто в настройках проекта смени кодировку.
2. wcstombs тебе в помощь
cgsg11
9 / 9 / 2
Регистрация: 09.03.2011
Сообщений: 38
12.06.2011, 23:47     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #4
Уважаемый!
а) пропишите лучше код, так будет нагляднее для будущих читателей
б) проверьте пожалуйста мой, если вас не затруднит.

И про визуалку, мне казалось, я уже пояснил...
Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
12.06.2011, 23:54     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #5
я не собираюсь за кого то решать их задачи. я лишь советую способы их решения.
значит используй второй способ. описание ищи в нете.
sannee
Просто хороший человек
363 / 156 / 12
Регистрация: 26.04.2011
Сообщений: 421
Завершенные тесты: 3
12.06.2011, 23:54     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #6
setlocale (LC_CTYPE,"rus");
cgsg11
9 / 9 / 2
Регистрация: 09.03.2011
Сообщений: 38
13.06.2011, 00:00     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #7
Ну это ты зря, злой такой на ночь глядя. ) ладно, юмор неуместен.

Короче, я оклемал вижуалку. мой метод работает. Локаль действительно надо юзнуть. Все, как и сказал.
Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
13.06.2011, 00:01  [ТС]     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #8
Нет возможности сейчас проверить. Большое спасибо!
cgsg11
9 / 9 / 2
Регистрация: 09.03.2011
Сообщений: 38
13.06.2011, 00:07     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #9
Мне щас больше стало интересно, на что у Тилка ругнулся компилятор... Кажется
а) ты пишешь на плюсах, следовательно нужно было явное приведение типа. Это раз.
б) Как-то сомнительно выглядит преобразование СИМВОЛА к СТРОКЕ. ты же помнишь, что в строку в конце ноль дописывается? (именно потому у меня ch[2])
Tilk
0 / 0 / 0
Регистрация: 13.03.2010
Сообщений: 79
13.06.2011, 00:09  [ТС]     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #10
Тема 21ого февраля была, что-то не могу найти проект, где эта проблема всплыла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2011, 00:11     Набор текста (Не выводятся русские буквы, WideCharToMultiByte)
Еще ссылки по теме:
C++ Русские буквы
русские буквы C++
Русские буквы C++
C++ русские буквы
Русские буквы в С C++

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

Или воспользуйтесь поиском по форуму:
cgsg11
9 / 9 / 2
Регистрация: 09.03.2011
Сообщений: 38
13.06.2011, 00:11     Набор текста (Не выводятся русские буквы, WideCharToMultiByte) #11
Поправлюсь, указатель на один символ.

Добавлено через 2 минуты
Понимаю. Я задался этим вопросом из интереса. )
плюс, может на что-то просветил кого-то, и кому-то сие будет полезно. )
Yandex
Объявления
13.06.2011, 00:11     Набор текста (Не выводятся русские буквы, WideCharToMultiByte)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru