Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Output Русского Char из массива некорректный


Автор: Robix 12.3.2011, 19:08
Когда с помощью ф-ции gets заношу строку состоящую из русских букв в массив char, то потом при выводе на экран через printf этого массива  получаются некорректные символы(с английскими буквами отображение правильное). Как исправить ситуацию с русскими ?

Приложение консольное под win32 VS2010.


Автор: 586 12.3.2011, 21:08
Код
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "");

    //...
}

Автор: alexvs11 12.3.2011, 21:52
либо использовать юникод, но в любом случае проверить, что шрифты консоли имеют русские символы в принципи

Автор: Robix 12.3.2011, 23:53
Не получается, к сожалению.  Вот прикрепляю пример. Гляньте, мож найдете в чем дело.
После компиляции в vs2010 консольное приложение без поддержки юникода при выводе списка в который заносились символы по-русски они выводятся некорректно (английские нормально)



Автор: миг 13.3.2011, 09:32
после открытия программы. в открывшимся консольном окне выберите свойства шрифта Lucida console(правая кнопка мыши)..

Автор: neokoder 13.3.2011, 19:28
Цитата(Robix @  12.3.2011,  23:53 Найти цитируемый пост)
Не получается, к сожалению.  Вот прикрепляю пример. Гляньте, мож найдете в чем дело.

В консоли кодировка CP866 - досовская. Надо преобразовывать.

Автор: neokoder 13.3.2011, 19:48
Цитата(миг @  13.3.2011,  09:32 Найти цитируемый пост)
после открытия программы. в открывшимся консольном окне выберите свойства шрифта Lucida console(правая кнопка мыши)..

Ни фига не сработает.

Лови код, Robix:
Код

       TCHAR mes[]=_T("File was create. Файл успешно создан.\x0\x0");
       char mes_866[100];
       int buf_size=WideCharToMultiByte(866,0,mes,lstrlen(mes),mes_866,0,"-",NULL);
       WideCharToMultiByte(866,0,mes,lstrlen(mes),mes_866,buf_size,"-",NULL);
       printf("%s\n",mes_866);




 

Автор: Robix 13.3.2011, 23:59
Цитата(миг @ 13.3.2011,  09:32)
после открытия программы. в открывшимся консольном окне выберите свойства шрифта Lucida console(правая кнопка мыши)..

Ага, спс, так нормально работает. Буду знать.

Автор: миг 14.3.2011, 05:31
Цитата(neokoder @  13.3.2011,  19:48 Найти цитируемый пост)
Ни фига не сработает.


Цитата(Robix @  13.3.2011,  23:59 Найти цитируемый пост)
Ага, спс, так нормально работает. Буду знать


без комментариев

Автор: neokoder3 14.3.2011, 08:07
Цитата(миг @  14.3.2011,  05:31 Найти цитируемый пост)
без комментариев

Не везде это будет работать. А мой код универсальный - всегда будет работать. Всё что вы сделали - это просто выбрали шрифт поддерживающий CP866 В консоли.

Блин, была бы возможность удалиил бы свой код. Вот пишешь, людям помогаешь, а благодарности в ответ никакой.

Автор: миг 15.3.2011, 05:30
Цитата(neokoder3 @  14.3.2011,  08:07 Найти цитируемый пост)
Блин, была бы возможность удалиил бы свой код. Вот пишешь, людям помогаешь, а благодарности в ответ никакой
Код

       TCHAR mes[]=_T("File was create. Файл успешно создан.\x0\x0");
       char mes_866[100];
       int buf_size=WideCharToMultiByte(866,0,mes,lstrlen(mes),mes_866,0,"-",NULL);
       WideCharToMultiByte(866,0,mes,lstrlen(mes),mes_866,buf_size,"-",NULL);
       printf("%s\n",mes_866);


мне кажется, что ваш код будет не совсем корректно работать. А именно при выводе строки на экран функцией printf. на экране появится не только эта строка "File was create. Файл успешно создан.", но еще и весь мусор, который храниться в массиве mes_866[100].  Так, что рекомендую добавить строчку mes_866[buf_size]='\0';

Автор: alexvs11 15.3.2011, 05:43
Цитата(миг @ 15.3.2011,  05:30)
Цитата(neokoder3 @  14.3.2011,  08:07 Найти цитируемый пост)
Блин, была бы возможность удалиил бы свой код. Вот пишешь, людям помогаешь, а благодарности в ответ никакой
Код

       TCHAR mes[]=_T("File was create. Файл успешно создан.\x0\x0");
       char mes_866[100];
       int buf_size=WideCharToMultiByte(866,0,mes,lstrlen(mes),mes_866,0,"-",NULL);
       WideCharToMultiByte(866,0,mes,lstrlen(mes),mes_866,buf_size,"-",NULL);
       printf("%s\n",mes_866);


мне кажется, что ваш код будет не совсем корректно работать. А именно при выводе строки на экран функцией printf. на экране появится не только эта строка "File was create. Файл успешно создан.", но еще и весь мусор, который храниться в массиве mes_866[100].  Так, что рекомендую добавить строчку mes_866[buf_size]='\0';

Цитата

Size, in characters, of the string indicated by lpWideCharStr. Alternatively, this parameter can be set set to -1 if the string is null-terminated. If cchWideChar is set to 0, the function fails.

If this parameter is -1, the function processes the entire input string, including the terminating null character. Therefore, the resulting character string has a terminating null character, and the length returned by the function includes this character.

If this parameter is set to a positive integer, the function processes exactly the specified number of characters. If the provided size does not include a terminating null character, the resulting character string is not null-terminated, and the returned length does not include this character.

ага, но можно убрать указание размера и все ок будет

Автор: neokoder7 16.3.2011, 14:24
Конечно же надо добавить нулевой символ в mes_866. Писал же в качестве примера, можно сказать в псевдокоде. Молодцы, что поправили.

Добавлено через 47 секунд
Меня тут банят, так что я уже тут не буду отвечать. Счастливо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)