Изменение кодировки, используемой для отображения выводимого в консоль текста
Вообще говоря, планируется перенаправлять вывод в файл (test.exe > test.txt), и в этом случае кодировка как раз и должна быть 1251. Но как сделать так, чтобы без перенаправления текст можно было прочитать в консоли? Или это несовместимые требования?
кодировка вылазит ну просто неприличное количество сообщений
в поиске по слову
Цитата: Tirpitz
Как можно в программе задать кодировку для отображение текста, выводимого в консоль функциями printf() и т.п. Ведь при написании исходного кода в Microsoft Visual C++ используется кодировка 1251, а при выполнении программы, в консоли используется кодировка 866. И в результате вместо символа '<' в исходном коде, в консоли появляется символ 'Л'.
Вообще говоря, планируется перенаправлять вывод в файл (test.exe > test.txt), и в этом случае кодировка как раз и должна быть 1251. Но как сделать так, чтобы без перенаправления текст можно было прочитать в консоли? Или это несовместимые требования?
Вообще говоря, планируется перенаправлять вывод в файл (test.exe > test.txt), и в этом случае кодировка как раз и должна быть 1251. Но как сделать так, чтобы без перенаправления текст можно было прочитать в консоли? Или это несовместимые требования?
CharToOEM?
Цитата: oxotnik333
в поиске по слову кодировка вылазит ну просто неприличное количество сообщений
Согласен. Тема не нова. Но все ответы сводятся к двум:
- Перекодировать текст из 1251 в 866 функцией CharToOem()
или
- При написании исходного кода сразу использовать кодировку 866.
А меня интересовало, есть ли способ сказать консоли,что символ с кодом 0xС0 надо отображать в кодировке 1251 - как символ 'А'. Функция SetConsoleOutputCP(1251) не помогает.
Цитата: Tirpitz
Согласен. Тема не нова. Но все ответы сводятся к двум:
- Перекодировать текст из 1251 в 866 функцией CharToOem()
или
- При написании исходного кода сразу использовать кодировку 866.
А меня интересовало, есть ли способ сказать консоли,что символ с кодом 0xС0 надо отображать в кодировке 1251 - как символ 'А'. Функция SetConsoleOutputCP(1251) не помогает.
- Перекодировать текст из 1251 в 866 функцией CharToOem()
или
- При написании исходного кода сразу использовать кодировку 866.
А меня интересовало, есть ли способ сказать консоли,что символ с кодом 0xС0 надо отображать в кодировке 1251 - как символ 'А'. Функция SetConsoleOutputCP(1251) не помогает.
Зачем консоли что то говорить? работаешь в своей программе с какой удобно кодировкой, а когда надо вывести в консоль CharToOem
Опять же, если использовать в программе test.exe перекодируемые функцией CharToOem() символы, то после перенаправления вывода в файл ("test.exe > test.txt"), получаем текстовый файл (test.txt) в кодировке 866. И ничего уже с ним не поделаешь (в смысле кодировки). Но ведь если запустить cmd.exe и набрать "сhсp 1251" а потом "test.exe", то что бы программа не выводила на консоль, консоль будет интерпретировать это в кодировке 1251. Отсюда возник вопрос: можно ли сразу в программе сказать "chcp 1251"?
Цитата: Tirpitz
Опять же, если использовать в программе test.exe перекодируемые функцией CharToOem() символы, то после перенаправления вывода в файл ("test.exe > test.txt"), получаем текстовый файл (test.txt) в кодировке 866. И ничего уже с ним не поделаешь (в смысле кодировки). Но ведь если запустить cmd.exe и набрать "сhсp 1251" а потом "test.exe", то что бы программа не выводила на консоль, консоль будет интерпретировать это в кодировке 1251. Отсюда возник вопрос: можно ли сразу в программе сказать "chcp 1251"?
ShellExecute не спасет отца русской демократии?
Пробовал system("chcp 1251") - не помогает. Так же как и system("mode con cp select=1251"). Да и так вообще не годится работать.
Вы можете установить конкретную кодовую страницу для стандартного потока вывода.
Цитата:
Вы можете установить конкретную кодовую страницу для стандартного потока вывода.
Звучит обнадеживающе... Может удастся разобраться как это делается. Как это делается именно в C, не C++.
Я честно говоря хз как там для C - в конце концов это ведь вам надо - но изменение локали потока ввода:
Код:
std::cout.imbue( std::locale("ru_RU") );
или чтото типа этого. За более подробной информацией смотрите Страуструпа.
В конце концов используйте команду chcp