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

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

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

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

21.02.2011, 00:24. Просмотров 3820. Ответов 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 а не чем-то другом =(
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 00:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Набор текста (Не выводятся русские буквы, WideCharToMultiByte) (C++):

Не выводятся русские буквы - C++
#include <iostream> using namespace std; int mul (int x, int y); // прототип функции mul() int main() ...

Не выводятся русские символы - C++
Программа не может вывести русские символы, но если оставить только функцию main то все отображается нормально #include <iostream> ...

Русские названия файлов выводятся некорректно - C++
У меня есть программа которая выводит список файлов каталога. Как сделать так, чтобы файлы с русскими названиями отображались корректно?

Русские символы в консоли выводятся нормально, латиница - нет - C++
Добрый день. Подскажите пожалуйста, столкнулся с следующей проблемой, когда вывожу в консоль русские символы все выводится нормально,...

Русские буквы - C++
такая ситуация : написал в консоле карточную игру, для обозначения значков мастей нужна строчка setlocale(LC_ALL,"rus"); а надо еще и...

Русские буквы - C++
Суть такая: надо записать в файл название модуля. Для модулей с английским названием и путём до них он пишет нормально, а на русском...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cgsg11
9 / 9 / 2
Регистрация: 09.03.2011
Сообщений: 38
12.06.2011, 22:46 #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"); вызвать в самом начале, в мейне.
Насколько я помню, так.
1
Aneron
158 / 157 / 12
Регистрация: 20.04.2010
Сообщений: 570
12.06.2011, 23:40 #3
1. если работаешь в студии то просто в настройках проекта смени кодировку.
2. wcstombs тебе в помощь
0
cgsg11
9 / 9 / 2
Регистрация: 09.03.2011
Сообщений: 38
12.06.2011, 23:47 #4
Уважаемый!
а) пропишите лучше код, так будет нагляднее для будущих читателей
б) проверьте пожалуйста мой, если вас не затруднит.

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

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

Добавлено через 2 минуты
Понимаю. Я задался этим вопросом из интереса. )
плюс, может на что-то просветил кого-то, и кому-то сие будет полезно. )
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2011, 00:11
Привет! Вот еще темы с ответами:

Русские буквы - C++
Всем добрый день. Необходимо написать программу, что бы она считала количество символов, с которых начинаются слова (например, &quot;привет,...

Русские буквы в С - C++
помогите разобраться с алфавитом в с как сделать что бы когда я ввожу русские буквы то компилятор не распознает их и я не могу работать с...

Русские буквы в C++ - C++
Помогите исправить, спасибо. Доброго времен суток! Я написал программу с Русскими буквами. Для ввода и вывода Русских букв,...

русские буквы - C++
Иероглифы вместо русских слов.Что делать??? (Пользуюсь С++ Builder 2010)


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.06.2011, 00:11
Ответ Создать тему
Опции темы

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