Можно ли добиться полной поддержки русского шрифта в командной строке? Пока я пришел к тому, что по-русски можно писать, но при попытке вывести русский текст для отображения или сохранить введенный текст в string содержимое теряет смысл, вероятно, из-за проблем с кодировкой.
25 марта 2008 в 4:00
2 Антон vermi1ion Коренчиков
Для начала проверьте, компилите ли вы КОНСОЛЬНУЮ программу?
В VS это обычно указывается при создании проекта, а потом весьма неочевидно может быть изменено. Признак консольного проекта: определенный макрос прекомпилятора _CONSOLE. А признак GUI-шного проекта – отсутсвие _CONSOLE и присутсвие _WINDOWS.
Я подозреваю, что это единственная ваша проблема, поскольку если в консольном приложении пользоваться стандартными функциями ввода вывода – то перекодирование OEM<->ANSI и обратно осуществляется прозрачно в библиотечных функциях и вы не должны от этого страдать.
Естественно при условии, что ввод и вывод осуществляются в одном окне, или в одной сессии, или даже в разных сессиях, но под одним и тем же локейлом (русским в вашем случае).
Если же ваше приложение графическое не по ошибке, а по постановке задачи, тогда, да, придется заниматься перекодирование в OEM при выводе в консоль. Да еще плюс к этому созданием консольного окна, подключением к его потокам и т.д и т.п.
Еще о хранении строк. Наиболее вероятно, чтовы используете STL-вскую строку std::string, которая есть basic_string<char>. Она годится для приема и хранения строк в одно- и много-байтовых кодировках, в том числе ANSI и OEM. Однако, если вы используете std::wstring, которая есть basic_string<wchar_t>, то она хранит символы в виде 2-х байтного юникода (UTF-16). Ввод-вывод в такую строку потребует перекодировки, иначе там образуется каша.
Но можно сделать так, чтобы приложение работало с юникодовской консолью (точнее прозрачно перекодировало OEM<->UTF16). Тогда ввод-вывод, хранение и обработку надо делать как раз с помощью std::wstring. Юникодовское приложение или нет опять-таки задается при создании проекта. См. верхнюю общюю страницу свойств проекта. Влияет на определение макросов UNICODE и _UNICODE, которых однако не видно в поле Precompiler Definitions. Главная функция программы будет wmain(int argc, wchar_t argv[]) вместо main(int argc, char * argv[]). Обратите внимание, что параметры также будут поступать в виде юникодовских wchar-овских строк.
9 марта 2008 в 14:01
не всегда в одной.
Особенно, если пишутся разными командами.
А то, что вывод не прошит в логику — факт.Он прошит в конфиг! Можно конфиг проекта, компилятора, софтины итоговой…какая фик разница…
9 марта 2008 в 14:00
Проекты итак обычно пищутся в одной кодировке, а грамотный оутпут вобще не должен быть прошит в логику. Так что кодировка там не особо нужна. Суть в умении выводить все в нужной кодировке, а не в том как это написанно в коде. Особенно когда мы пишем периспользуемый код, который неизвестно в скольких и каких проектах будет применяться.
9 марта 2008 в 10:05
UTF — да, разный.UTF-7,8,16,32. Но это уже фигня (т.к. они для русского взаимозаменяемы, и пользуется только 8-й).
А вообще, не проще ли весь проект писать в UTF. В конфиге описать кодировку вывода для консоли и для экранных виджетов (можно и автоматом из локали). И написать функцию, которая будет усё переводить автоматом из локали проекта в локаль системы.
Кстати, про умение собирать: многие дистрибутивы Linux уже отказались от зоопарка локалей и перешли на utf…
9 марта 2008 в 9:00
UTF тоже разный бывает. И это не отменяет разнообразие уже существующих консолей, под которые желаельно уметь собирать уже существующий код.
8 марта 2008 в 19:03
Товарищи!!!Может хватит заниматься фигнёй и дружно перейдем на UTF?
Винда его в консоли прекрасно кушает.
8 марта 2008 в 17:00
Прочитай про такую вещь как locale из стандартной библиотеки.
Устанавливай нужную локаль в зависимости от того, в какой кодировке должен быть оутпут и исспользуй эту локаль для вывода.
8 марта 2008 в 0:02
>help chcp
Displays or sets the active code page number.
CHCP [nnn]
nnn Specifies a code page number.
Type CHCP without a parameter to display the active code page number.
>chcp
Active code page: 866
>
7 марта 2008 в 22:05
Спасибо, попробую))
за джедайский способ +1)))
7 марта 2008 в 10:03
юзай функцию CharToOem(char * source, char * dest);
либо птчить файл кодовой страницы
либо как истинные джедаи писать "кракозяблями" в исходнике для того чтоб отобразилось нормально в консоли
7 марта 2008 в 7:02
да, не подумал=)) Windows xp, среда разработки – Visual C++ 2008. командная строка – просто cmd.exe, консоль, иначе говоря. В visual studio есть и своя, но разницы между ними, вроде нет. Думаю, проблемы именно в кодировке, вопрос в том, как изменить кодировку, используюмую программой, написанной в с++?
7 марта 2008 в 6:02
Командная строка чего? В какой ОС?
Имеется ввиду может русская кодировка? Дык надо просто выводить текст в кодировке, поддерживаемой этой консолью. )