кириллица в консоли

Тема в разделе "WASM.BEGINNERS", создана пользователем cresta, 9 ноя 2005.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Как делается? А то cout и printf показывают кракозяблы :dntknw:
     
  2. Stub

    Stub New Member

    Публикаций:
    0
    Регистрация:
    11 май 2004
    Сообщения:
    311
    Адрес:
    Siberia
    Я добился показа кирилицы в консоли только используя кодировку DOS для шрифта.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Можно добиться, не конвертируя каждую строку отдельно?
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В общем, ничего кроме как пускать каждую строку через CharToOem, не нашёл...
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    cresta

    Можно писать исходный код сразу в кодировке DOS :)



    Ещё консоль NT поддерживает юникод. Правда, я не в курсе, как его разруливать. Сам хотел бы узнать.
     
  6. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




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

    А то исходник совершенно нечитабельный, как в CodeBlocks, так и в SourceInsight. А выбора кодировки в редакторе кода нет.

    А может Ворд как ИДЕ использовать :)))))

    Машина то мощнейшая!!! Какое ИДЕ получится!

    Написать ему макросы для компиляции и линковки, а ?

    :))))))
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta

    А переключать кодовую страницу на ANSI Cyrillic пробовал ?

    SetConsoleOutputCP(1251)
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Пробовал.

    И SetConsoleCP тоже. Возвращают success, GetLastError - 0, а вывод все равно кракозяблый :dntknw:
     
  9. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    В Visual Studio можно выбирать кодировку исходника (File > Advanced Save Options > Cyrillic - DOS).



    Насчет Юникода в консоли: это делается с помощью WriteConsoleW, но толку все равно мало, так как в Win XP SP2 работают только русский и английский алфавиты. Я попробовал пару символов из Latin-1 (Зап. Европа) и Latin Extended-A (Вост.Европа) - вместо них выводятся соответствующие латинские буквы без диакритических знаков. Об иероглифах и говорить нечего - превращаются в знаки вопроса. Смена шрифта консоли с растрового на векторный не помогает.



    Видимо, других вариантов нет. Но если у кого-нибудь есть работающий пример с символами из нескольких блоков Unicode (чтобы сразу и Latin-1, и кириллица, и китайский) в консоли, откликнитесь, пожалуйста!



    Special note to cresta: файл test.cpp во вложении записан в кодировке UTF-8; если твои замысловатые редакторы кода его не берут, попробуй посмотреть файл в Word, 2003-я версия открывает без проблем :).

    [​IMG] 197961554__UnicodeConsoleTest.rar
     
  10. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Если нужно перекодировать исходники в 866 перед компиляцией, то добавь вызов программки tconv в Custom Build Steps. Публикую ее здесь, так как сайт автора сдох. Если не нравится, что старая и досовская, напиши свою, это займет всего пару часов.

    [​IMG] _2124644774__tconv.rar
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
  12. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    SDragon

    По любому надо преобразовывать: хоть в юникод, хоть в дос. А с утилиткой хорошая мысль - сделать её в нормальном варианте, с переключением кодировок и предпросмотром
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta

    > "По любому надо преобразовывать: хоть в юникод"

    А разве нельзя в исходнике задавать строки сразу в юникоде ? (ты про asm или HLL ?)



    Вообще-то весьма странно, что SetConsoleOutputCP не работает. В msdn вроде никаких примечаний нет, кроме того что можно использовать только доступные кодировки :dntknw:
     
  14. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    leo

    код на срр. Тут дело такое: в исходнике валом строк, а если их объявлять юникодом, то как я понимаю, их надо все описывать отдельно типа wchar mystrin123[] = "абв"; а в самом исходнике писать printf(mystring123);. Не очень наглядно. В то время как неюникодные строки можно сразу по месту лепить: printf( conv_dos("абв")); Читабельность выше :)
     
  15. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    cresta

    Понятно, ну так и лепи по месту;)

    Тебя что - быстродействие преобразования в OEM смущает или просто сомнения из области "как-то некрасиво" ;))



    Кстати попробовал я в win 98 батник запустить для установки mode con codepage в 1251 - дык получил ругань в ответ, мол неверный номер кодовой страницы ?! Интересно в XP тоже такая петрушка или нет, надо бы попробовать..
     
  16. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В смысле как по месту? printf ( MultiByteToWideChar("blabla")); Или как? Если писать "строка", то как обозначить, что она юникод? #define UNICODE или что-то подобное? Так SDragon заметил о проблемах с юникодом.
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    L"unicode текст"
     
  18. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    WriteConsoleW(hStdout, L"unicode хайа", wcslen(L"unicode хайа"), &write, NULL);

    А что до сих пор молчал, как партизан на допросе?

    :)))
     
  19. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Код (Text):
    1. #define UNICODE
    2. #include <windows.h>
    3.  
    4. ...
    5. printf(TEXT("blabla"))




    TEXT разворачивается в юниководую строку L"blabla", если #define UNICODE включен, и "blabla", если не включен. В <tchar.h> есть аналогичный макрос _T (удобнее, чем TEXT, так как на два символа меньше набирать).





    Заметь, что Unicode в консоли работает только в Win NT, так что рано радоваться: в Win 9x это работать не будет.



    IceStudent, спасибо за ссылку, хотя автор приходит к тому же неутешительному выводу, что и я:



    Видимо, не дано нам увидеть в консоли русские буквы вперемешку с французскими, ни с помощью #define UNICODE, ни с SetConsoleOutputCP(65001).
     
  20. bazil

    bazil New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2005
    Сообщения:
    4
    Адрес:
    Russia
    В C++ можно создать свой класс типа oem_string запихать в него функцию CharToOem(), научить cout выводить его на консоль. В общем, объектно-ориентированный подход. Производительность не измениться, т.к. вывод на консоль все равно будет медленнее.