На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: JoeUser, Qraizer, Hsilgos
  
> Каркас таблицы (псевдографика) выводится вопросами в консоли, чистый СИ, visual studio 2010
    Всем хай! Сходу к делу!

    Есть код:
    ExpandedWrap disabled
          //SetConsoleOutputCP(866);
          //SetConsoleCP(866);
          printf("  ╔═════╦════════════════════╦════════════════════╗\n");//  ╚╔ ╩ ╦ ╠ ═ ╬ ╣ ║ ╗ ╝
          printf("  ║  №: ║       Марка     ║         ФИО        ║\n");
          printf("  ╠═════╬════════════════════╬════════════════════╣\n");


    при выводе вся псевдографика меняется на знаки ВОПРОСОВ (выглядит чертовски коряво).
    я вроде понимаю, что дело в кодировке, но как не пытался играться с setlocale, SetConsoleCP и пр. никак не могу добиться распечатки правильного каркаса...

    подскажите, как быть-то?
    I originate
    You must appreciate, all the others imitate

    SCOOTER "GUEST LIST"

    'Pon the mic I'm the teacher!
    Spread my words like a preacher!
    Yiiihhaaaa!!!!

    SCOOTER "WEEKEND"
      ИМХО дело в кодировке исходного текста. В 1251 символов псевдографики нет вообще, так что строковые литералы будут содержать что угодно, но не их. Смени кодирование на 866, вывод в консоль даже не придётся настраивать.
      Одни с годами умнеют, другие становятся старше.
        Цитата Qraizer @
        ИМХО дело в кодировке исходного текста. В 1251 символов псевдографики нет вообще, так что строковые литералы будут содержать что угодно, но не их. Смени кодирование на 866, вывод в консоль даже не придётся настраивать.

        Qraizer, а ведь ты правильную идею говоришь, т к я помню, что когда начал в коде пропечатывать эти АЛЬТ-символы (через малую правую клавиатуру), а потом нажал компиляция, то VS выдала какое-то сообщение о том, что мол кодировка страницы будет сменена на что-то там. Я не придал этому значения, даже сообщение до конца не дочитал. и вот сейчас получил проблемы...

        Цитата Qraizer @
        Смени кодирование на 866

        программно или через опции VS??
        P.S. я совсем запутался с этой псевдографикой в консоли VS. Вроде несложно все это, но нужно понимать нюансы очень хорошо
        I originate
        You must appreciate, all the others imitate

        SCOOTER "GUEST LIST"

        'Pon the mic I'm the teacher!
        Spread my words like a preacher!
        Yiiihhaaaa!!!!

        SCOOTER "WEEKEND"
          Цитата FasterHarder @
          программно или через опции VS??
          В .c-файле. В Far-е это примерно так:
          Прикреплённая картинка
          Прикреплённая картинка
          Одни с годами умнеют, другие становятся старше.
            Уходите вы от этих однобайтовых кодировок!
            Юникод прекрасно сохраняет псевдографику.
            Писать нужно в Юникоде, а выводить уже как
            тянет кодировка консоли.

            user posted image
            Мои программные ништякиhttp://majestio.info
              пишу код в среде Visual Studio. Там есть Файл - Дополнительные параметры сохранения
              Прикреплённая картинка
              Прикреплённая картинка


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

              Какую из списка кодировку нужно поставить + всякие setlocale никак не мешают здесь?
              I originate
              You must appreciate, all the others imitate

              SCOOTER "GUEST LIST"

              'Pon the mic I'm the teacher!
              Spread my words like a preacher!
              Yiiihhaaaa!!!!

              SCOOTER "WEEKEND"
                FasterHarder, надо отделить пчел от меда :lol:

                Однобайтовые кодировки уже давно - анахронизм. Это аксиома, если желаешь чтобы твои проги были user frendly.
                Многобайтовых кодировок множество, основное распространение получила UTF-8, т.к. в общем зачете для разработки программ в ней больше плюсов, чем минусов по сравнению, к примеру с UTF-16 или UTF-32. Поэтому пользуем строго UTF-8.

                При сохранении документов в кодировке UTF-8 нередко используют спецификацию BOM (сокращенно от Byte Order Mark). Использование UTF-8 с BOM - затея ошибочная, по сути, и Мелкософт тут лоханулся. Ибо проблемы порядка байтов для UTF-8 не существует! BOM актуален для UTF-16 и UTF-32. Более того, спецификация Unicode 5.0 настоятельно рекомендует не использовать BOM с UTF-8 (см.2.6 спецификации):

                Цитата
                ...
                Use of a BOM is neither required nor recommended for UTF-8, but may be encountered in contexts where UTF-8 data is converted from other encoding forms that use a BOM or where the BOM is used as a UTF-8 signature.
                ...

                А теперь про использование ... Тут два этапа - разработки и исполнения.

                Этап разработки

                В редакторе используем UTF-8 и пользуемся всеми плюшками обширной таблицы кодов. Компиляторы этому не противятся и работают прекрасно. Естественно, все строковые константы имеют многобайтную кодировку.

                Этап исполнения

                Вот тут нужно быть аккуратнее. При использовании API операционных систем следует выбирать варианты функции, которые работают с многобайтными кодировками. Однако, перед использованием, к примеру, WinAPI-функций, UTF-8 строки нужно перекодировать в UCS-2 (примерно совпадает с UTF-16).

                Что же касается вывода UTF-8 строк в консоль, нужно смотреть свойства консоли. Если консоль работает непосредственно с UTF-8, то никаких преобразование не требуется (современные консоли GUI, или при определенных настройках, системные консоли *nix). Что касается вывода в "консоль" (хотя она не является таковой) русифицированной Windows - там cp866. Соответственно, требуется перекодировка. Тут два варианта:

                1) Использовать возможности Windows (пример)
                2) Использовать возможности С++ (пример)

                Ну вот как-то так.
                Мои программные ништякиhttp://majestio.info
                  Цитата FasterHarder @
                  Какую из списка кодировку нужно поставить + всякие setlocale никак не мешают здесь?
                  Ну последняя же. Кириллица (DOS), 866-ая. И никаких локалей.
                  JoeUser, от UTF-8 больше проблем. Хотя бы из-за sizeof(char[]) != strlen(char[])+1. Я, вон, где-то выкладывал обобщённую функцию сортировки многобайтовой строки, там на целый экран манипуляций с символами.
                  Одни с годами умнеют, другие становятся старше.
                    Цитата Qraizer @
                    JoeUser, от UTF-8 больше проблем

                    Повторюсь - есть плюсы, есть минусы. Строки с символами переменной длины хуже парсятся, сортируются - это минус. Но хорошо экономят пространство хранения, обеспечивая широкий набор глифов - это жирный плюс (допустим по сравнению с UTF-32). Что же касается обработки большого объема данных, так, имхо, их нужно не самому решать - а возложить это на SQL БД.

                    Добавлено
                    ЗЫ: Нет, не отрицаю, если речь идет о создании софта для местного рынка или для себя, и не нужно, к примеру, использовать какое-то расширенное оформление - можно и не заморачиваться, а взять по старинке cp866.
                    Мои программные ништякиhttp://majestio.info
                      Цитата Qraizer @
                      Ну последняя же. Кириллица (DOS), 866-ая. И никаких локалей.

                      да, это кодировка решила все проблемы :yes: спс
                      протестил на этом примере:
                      ExpandedWrap disabled
                        #include "stdafx.h"
                        #include <stdio.h>
                        #include <conio.h>
                         
                        int _tmain(int argc, _TCHAR* argv[])
                        {
                            printf("  ╔═════╦════════════════════╦════════════════════╗\n");//  ╚╔ ╩ ╦ ╠ ═ ╬ ╣ ║ ╗ ╝
                            printf("Привет, мир!");
                            getch();
                            return 0;
                        }

                      вывод:
                      Прикреплённая картинка
                      Прикреплённая картинка


                      кстати, это кодировку я проверял на исходом проекте: русский текст печатался кракозябрами, а псевдографиками - вопросами. А вот новый проект(код чуть выше) отработал на ура без всяких локалей. Ведать что-то там сбилось в исходном проекте.

                      В общем, нужно СРАЗУ при создании проекта переходить на эту кодировку и все, проблем не будет. Хотя, нужно проверить, считывает ли русский текст с клавиатуры правильно (не придется ли переключаться на кодировку 1251)...

                      Добавлено
                      проверил. считывается русский текст отлично.

                      В общем НАДО СРАЗУ СТАВИТЬ ЭТУ КОДИРОВКУ ДА И ВСЕ!
                      I originate
                      You must appreciate, all the others imitate

                      SCOOTER "GUEST LIST"

                      'Pon the mic I'm the teacher!
                      Spread my words like a preacher!
                      Yiiihhaaaa!!!!

                      SCOOTER "WEEKEND"
                        Цитата FasterHarder @
                        В общем НАДО СРАЗУ СТАВИТЬ ЭТУ КОДИРОВКУ ДА И ВСЕ!

                        Это, как бы, тебе повезло.
                        А если нужно получать строки из Linux или наоборот - слать туда ?
                        Чаще всего у Виндус используется 4 кодировки - utf16, utf8, CP1251, CP866.
                        Штатными средствами Виндус можно преобразовать любую из них в любую из них.
                        Подпись была выключена в связи с наложенным заземлением.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script Execution time: 0,1685 ]   [ 24 queries used ]   [ Generated: 20.10.19, 14:05 GMT ]