Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Output Русского Char из массива некорректный 
:(
    Опции темы
Robix
Дата 12.3.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



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

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


PM MAIL   Вверх
586
Дата 12.3.2011, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 6
Всего: 146



Код
#include <locale.h>

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

    //...
}

PM   Вверх
alexvs11
Дата 12.3.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



либо использовать юникод, но в любом случае проверить, что шрифты консоли имеют русские символы в принципи
PM MAIL   Вверх
Robix
Дата 12.3.2011, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



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




Это сообщение отредактировал(а) Robix - 12.3.2011, 23:58

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  post.cpp 2,55 Kb
PM MAIL   Вверх
миг
Дата 13.3.2011, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



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

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  post.cpp 2,62 Kb
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
neokoder
Дата 13.3.2011, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: -2
Всего: -3



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

В консоли кодировка CP866 - досовская. Надо преобразовывать.
PM MAIL   Вверх
neokoder
Дата 13.3.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: -2
Всего: -3



Цитата(миг @  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);




 
PM MAIL   Вверх
Robix
Дата 13.3.2011, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 1.6.2009

Репутация: нет
Всего: нет



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

Ага, спс, так нормально работает. Буду знать.
PM MAIL   Вверх
миг
Дата 14.3.2011, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



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


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


без комментариев
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
neokoder3
Дата 14.3.2011, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.3.2011

Репутация: нет
Всего: нет



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

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

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

PM MAIL   Вверх
миг
Дата 15.3.2011, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



Цитата(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';

Это сообщение отредактировал(а) миг - 15.3.2011, 05:33
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
alexvs11
Дата 15.3.2011, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



Цитата(миг @ 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.

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

PM MAIL   Вверх
neokoder7
Дата 16.3.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 16.3.2011

Репутация: нет
Всего: нет



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

Добавлено через 47 секунд
Меня тут банят, так что я уже тут не буду отвечать. Счастливо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0821 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.