Почему вместо русских букв в консольном приложении выводится
От: Алексей Кирюшкин Россия http://malgarr.blogspot.com/
Дата: 24.08.01 19:48
Оценка: 145 (4) -1 :)
Статья:
Почему вместо русских букв в консольном приложении выводится мусор?
Автор(ы): Алексей Кирюшкин


Авторы:
Алексей Кирюшкин

Аннотация:
Итак, Вы сваяли в Visual Studio что-то типа

#include "stdafx.h"
int main(int argc, char* argv[])
{
    printf("Привет всем!\n");
    return 0;
}


Запускаете сей шедевр на исполнение и видите

¦ЁштхЄ тёхь!


и правильно!Текст программы Вы набирали в родном редакторе Visual Studio, используя кодовую страницу 1251, а вывод текста в консольном приложении идет с использованием кодовой страницы 866. Что же делать с этим безобразием? Как известно из любого безвыходного положенния есть по крайней мере 3 выхода. Рассмотрим их по-порядку.
ШтЫрлитц
От: M@VRiK  
Дата: 27.04.02 01:15
Оценка: -2 :))
А не проще ль перекодировать перекодировщиком типа Штирлица, а потом и компилить
Есть ещё способ
От: Сомов Александр Россия  
Дата: 23.11.01 01:11
Оценка: 24 (2) +1
Сначала вызвать _wsetlocale(LC_ALL, L"CP866") и потом везде выводить wprintf'ом.
Народ, привыкайте к Уникоду!!!
Русские буквы в консольном приложении
От: overlord http://overlord.mmdl.ru
Дата: 25.08.01 19:48
Оценка:
Как насчет определения специализации для шаблона класса ostream ???
В специализации оператора << для const char * и char * вызывать конвертирование текста при помощи функции CharToOem.
Re: Есть ещё способ
От: sinaps Россия  
Дата: 14.01.02 02:41
Оценка: 27 (4) +1
Как мне показалось, вот так действительно будет работать:

int main(int argc, char* argv[])
{
char* locale = setlocale( LC_ALL, ".OCP" );
printf("[%s]\n",locale);
wprintf(L"Тестовая строка\n");
return 0;
}
С уважением Турлаков К.Е.
Re: Почему вместо русских букв в консольном приложении вывод
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 27.11.03 15:23
Оценка:
Sm. здесь
Автор: Slicer [Mirkwood]
Дата: 27.11.03
. Nikakie izemenija suschestvujuschego koda ne nuzhny.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re: А почему нельзя воспользоваться SetConsoleOutputCP(1251)
От: Suhoy  
Дата: 16.03.04 13:55
Оценка:
и все дела...
Re[2]: А почему нельзя воспользоваться SetConsoleOutputCP(12
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 16.03.04 14:38
Оценка:
Товарищ, я предлагаю Вам сперва статью пролистать

Впрочем, это и не выход даже, а так, тупичок. Работает он только, если соблюдены 3 условия:

— Ваша программа будет работать только под Windows NT
— Для окна вашей программы будет всегда установлен шрифт Lucida Console
— Ваша программа никогда не будет работать в полноэкранном режиме — только в окне.
Если все эти 3 условия соблюдены, достаточно вставить вначале программы вызов функции SetConsoleOutputCP, задав в качестве параметра нужную нам кодовую страницу

От себя: на самом деле второе условие включает третье

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re: Почему вместо русских букв в консольном приложении вывод
От: BlackHeretic Израиль  
Дата: 16.03.04 14:40
Оценка: 1 (1) +3
Здравствуйте, Алексей Кирюшкин, Вы писали:

АК>Статья:



АК>Авторы:

АК> Алексей Кирюшкин

АК>Аннотация:

АК>Итак, Вы сваяли в Visual Studio что-то типа

АК>
АК>#include "stdafx.h"
АК>int main(int argc, char* argv[])
АК>{
АК>    printf("Привет всем!\n");
АК>    return 0;
АК>}
АК>


АК>Запускаете сей шедевр на исполнение и видите


АК>
АК>¦ЁштхЄ тёхь! 
АК>


АК>и правильно!Текст программы Вы набирали в родном редакторе Visual Studio, используя кодовую страницу 1251, а вывод текста в консольном приложении идет с использованием кодовой страницы 866. Что же делать с этим безобразием? Как известно из любого безвыходного положенния есть по крайней мере 3 выхода. Рассмотрим их по-порядку.


Работаю в отделе локализации программ — руки поотбивал бы писателям в коде строк которые увидит пользователь, с особым садизмом сделал бы это с теми кто при этом использует символы отличные от ASCII.
String Table для чего сществует?
ICQ 156156278
Re[3]: Сорри за невнимательность :)
От: Suhoy  
Дата: 17.03.04 07:38
Оценка:
Действительно, не дочитал...
Re[2]: А почему нельзя воспользоваться SetConsoleOutputCP(12
От: unintruder  
Дата: 28.03.04 04:40
Оценка:
Здравствуйте, Suhoy, Вы писали:

Я пишу в студии программу для терминала покупателя ( Cipher LAb CPT — 711 ). Для меня данная проблема актуальна, работать в студии и хочется и колется, но первый вариант как-то кривоват, подумываю о написании макроса для студии, который бы переводил символы из Win в Dos кодировку одним нажатием, или такое уже есть ? посоветуйте

PS: Компилятор syntech C ANSI и урезанный при этом, так что в этом случае всякие элементы высшего пилотажа с решением проблемы "внутри" кода исключены

S>и все дела...
... << RSDN@Home 1.1.0 stable >>
Re[3]: А почему нельзя воспользоваться SetConsoleOutputCP(12
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 29.03.04 03:57
Оценка:
Ну а почему бы pipes не воспользоваться, как я предлагал? Или этот компилятор даже APIшки напрямую юзать не позволяет?

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re[4]: А почему нельзя воспользоваться SetConsoleOutputCP(12
От: unintruder  
Дата: 29.03.04 07:53
Оценка:
Здравствуйте, Slicer [Mirkwood], Вы писали:

SM>Ну а почему бы pipes не воспользоваться, как я предлагал? Или этот компилятор даже APIшки напрямую юзать не позволяет?


Этот C компилятор "вещь в себе" ( слегка ANSI ), я собираю код в файл user.shx, а затем делаю download в device ( через rs232 ), ну и соответсвенно ни пайпов ни др. апи там не заюзать , теоретически можно реализовать в нем CharToOEM, но это имхо лишнее, негоже прошивку усложнять из-за среды разработки

SM>Slicer
... << RSDN@Home 1.1.0 stable >>
Re: Почему вместо русских букв в консольном приложении вывод
От: Olga____  
Дата: 26.09.04 09:09
Оценка:
Здравствуйте, Алексей Кирюшкин, Вы писали:

Здравствуйте! По ссылке http://www.ruslat.wm.ru/ ничего не открывается. В интернете много программ с таким же названием, но единственное, что они меняют, это картинка в правом нижнем углу. Что я делаю не так? Спасибо.
Re[2]: Почему вместо русских букв в консольном приложении вы
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 27.09.04 02:59
Оценка:
Здравствуйте, Olga____, Вы писали:

O__>По ссылке http://www.ruslat.wm.ru/ ничего не открывается.


помер вот то что у меня осталось — http://gzip.rsdn.ru/File/82/RusLat.rar

O__>В интернете много программ с таким же названием, но единственное, что они меняют, это картинка в правом нижнем углу. Что я делаю не так? Спасибо.


Re: Самое простое решение
От: nailick  
Дата: 09.12.04 15:41
Оценка: 7 (3) +1
Если кто еще не знает, в VS .NET, не знаю в каком(у меня 2003), в меню File появился пункт "Advanced Save Options", в нем можно выбрать кодировку, в которой сохраняется исходник, что и есть решение всей проблемы. В выбранной кодировке сохраняются все файлы проекта.
Re: Почему вместо русских букв в консольном приложении вывод
От: BOPOH_N Россия  
Дата: 04.05.05 13:24
Оценка: 16 (2)
Решение в стиле С++


#include <iostream>
#include <sstream>
#include <vector>

std::basic_ostream< char, std::char_traits<char> >& operator << ( std::basic_ostream< char, std::char_traits<char> >& out, const char* str )
{
    std::vector<char> temp(strlen(str)+1);        
    if(::CharToOemA( str, &temp[0]))
    {
        std::string dest(&temp[0]);
        out << dest;
    }
    return out;
}

std::basic_ostream< wchar_t, std::char_traits<wchar_t> >& operator << ( std::basic_ostream< wchar_t, std::char_traits<wchar_t> >& out, const wchar_t* str )
{
    std::vector<char> dest(wcslen(str)+1);    
    if(::CharToOemW( str, &dest[0]))
        out << &dest[0];
    return out;
}

int _tmain(int argc, _TCHAR* argv[])
{    
    std::wcout << L"Тра-ля-ля" << std::endl;
    std::cout << "Тра-ля-ля" << std::endl;
    return 0;
}
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re: Почему вместо русских букв в консольном приложении вывод
От: 4ertus2  
Дата: 01.08.05 14:41
Оценка:
Решение проблемы в стиле UNIX:


#define FROM_CP "CP1251"
#define TO_CP   "CP866"

char cdata[1024];
...
cp_conv = iconv_open(TO_CP,FROM_CP);
...
size_t in_len = len, out_len = len;
char *dt = cdata;
size_t ic_len = iconv(cp_conv,(const char**)&dt,&in_len,&dt,&out_len);
...
iconv_close(cp_conv);


Не знаю как прикрутить к вижуалу, а Dev-C++ + libiconv все здорово понимает.
Непривязанное к форме вечно.
Re: Почему вместо русских букв в консольном приложении вывод
От: EqWu Россия  
Дата: 01.08.05 15:28
Оценка:
А еще можно пропускать через себя весь вывод.
Создать поток, в нем узнать и сохранить старый дескриптор для вывода на консоль (GetStdHandle)
Создать pipe и на через SetStdHandle установить его как вывод консоли.
Пришло чего-нибудь в pipe — делаем CharToOem и в "старый" вывод это дело.
Работает сразу в масштабе всего приложения.
В MSDN есть даже пример похожий. В нем только CharToOem не делают.
Может и будут косяки, но в целом, вроде, должно работать.
Re[2]: Почему вместо русских букв в консольном приложении вы
От: tarkil Россия http://5209.copi.ru/
Дата: 25.07.06 05:42
Оценка: 4 (3)
Здравствуйте, BOPOH_N, Вы писали:

BOP>Решение в стиле С++


Более удачное решение здесь
Автор: Serg Bormant
Дата: 05.09.03
.
--
wbr, Peter Taran
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.