singlepost

cmd << На главную или назад  

Можно ли добиться полной поддержки русского шрифта в командной строке? Пока я пришел к тому, что по-русски можно писать, но при попытке вывести русский текст для отображения или сохранить введенный текст в string содержимое теряет смысл, вероятно, из-за проблем с кодировкой.

12 ответов в теме “cmd”

  1. 12
    Юрий Солнцев ответил:

    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-овских строк.

  2. 11
    Евгений Князев ответил:

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

    А то, что вывод не прошит в логику — факт.Он прошит в конфиг! Можно конфиг проекта, компилятора, софтины итоговой…какая фик разница…

  3. 10
    Андрей Куликов ответил:

    Проекты итак обычно пищутся в одной кодировке, а грамотный оутпут вобще не должен быть прошит в логику. Так что кодировка там не особо нужна. Суть в умении выводить все в нужной кодировке, а не в том как это написанно в коде. Особенно когда мы пишем периспользуемый код, который неизвестно в скольких и каких проектах будет применяться.

  4. 9
    Евгений Князев ответил:

    UTF — да, разный.UTF-7,8,16,32. Но это уже фигня (т.к. они для русского взаимозаменяемы, и пользуется только 8-й).

    А вообще, не проще ли весь проект писать в UTF. В конфиге описать кодировку вывода для консоли и для экранных виджетов (можно и автоматом из локали). И написать функцию, которая будет усё переводить автоматом из локали проекта в локаль системы.

    Кстати, про умение собирать: многие дистрибутивы Linux уже отказались от зоопарка локалей и перешли на utf…

  5. 8
    Андрей Куликов ответил:

    UTF тоже разный бывает. И это не отменяет разнообразие уже существующих консолей, под которые желаельно уметь собирать уже существующий код.

  6. 7
    Евгений Князев ответил:

    Товарищи!!!Может хватит заниматься фигнёй и дружно перейдем на UTF?
    Винда его в консоли прекрасно кушает.

  7. 6
    Андрей Куликов ответил:

    Прочитай про такую вещь как locale из стандартной библиотеки.
    Устанавливай нужную локаль в зависимости от того, в какой кодировке должен быть оутпут и исспользуй эту локаль для вывода.

  8. 5
    Леонид Максимов ответил:

    >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

    >

  9. 4
    Василий Степанов ответил:

    Спасибо, попробую))
    за джедайский способ +1)))

  10. 3
    Юрка Водясов ответил:

    юзай функцию CharToOem(char * source, char * dest);
    либо птчить файл кодовой страницы
    либо как истинные джедаи писать "кракозяблями" в исходнике для того чтоб отобразилось нормально в консоли

  11. 2
    Василий Степанов ответил:

    да, не подумал=)) Windows xp, среда разработки – Visual C++ 2008. командная строка – просто cmd.exe, консоль, иначе говоря. В visual studio есть и своя, но разницы между ними, вроде нет. Думаю, проблемы именно в кодировке, вопрос в том, как изменить кодировку, используюмую программой, написанной в с++?

  12. 1
    Андрей Куликов ответил:

    Командная строка чего? В какой ОС?
    Имеется ввиду может русская кодировка? Дык надо просто выводить текст в кодировке, поддерживаемой этой консолью. )

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.