Linux изменить кодировку консоли

Кодировка в консоли (Решено)

# 3 года, 7 месяцев назад (отредактировано 3 года, 7 месяцев назад)

Здравствуйте.
Устанавливаю арч на ноутбук, вроде всё делаю по проторенной уже дорожке, но наверное раз на раз не приходится.
Создал файл:

Раскоментировал в файле locale.gen, строки

В locale.conf прописал:

И сгенерировал всё это командой locale-gen. Вроде не первый раз но пока не воспользуещься командой , показывает кракозябры.
Может что-то изменилось в установке или на ноутбуках своя специфика.
Подскажите где делаю ошибку.

# 3 года, 7 месяцев назад (отредактировано 3 года, 7 месяцев назад)

Если для вашей видеокарты при загрузке системы подключается drm-модуль, например i915 для intel, его старт приводит к появлению нового устройства фреймбуфера (или замене старого на новый) (/dev/fb0 и т.д.), и повторной инициализации консоли со сбросом шрифта. Если это происходит уже после того, как systemd-vconsole-setup загрузила ваш шрифт, вам требуется либо загрузить его повторно, либо обеспечить старт drm-модуля заведомо раньше загрузки шрифта.

Если для вашей видеокарты при загрузке системы подключается drm-модуль, например i915 для intel, его старт приводит к появлению нового устройства фреймбуфера (или замене старого на новый) (/dev/fb0 и т.д.), и повторной инициализации консоли со сбросом шрифта. Если это происходит уже после того, как systemd-vconsole-setup загрузила ваш шрифт, вам требуется либо загрузить его повторно, либо обеспечить старт drm-модуля заведомо раньше загрузки шрифта.

Вики русский
Суть уловил с исполнением пока туговато, будем понемногу разбираться. Спасибо за пояснение и способ решения.
Тема на форуме

# 3 года, 7 месяцев назад (отредактировано 3 года, 7 месяцев назад)

ZeniaM
Суть уловил с исполнением пока туговато, будем понемногу разбираться. Спасибо за пояснение и способ решения.

ZeniaM
Суть уловил с исполнением пока туговато, будем понемногу разбираться. Спасибо за пояснение и способ решения.

Источник

H Кодировка символов и Console в черновиках Tutorial

Немного теории

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

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

Немного практики

В современном мире, почти все кодировки и отображение контролирует операционная система, чаще всего в Windows отображаются кракозябры, а в Linux все хорошо, и новичкам советуют ставить Linux и не «париться», это в корне не верный подход, На самом деле все дело в настройках операционной системе на которой вы работаете. В Linux кодировка и отображение кодировки настроено на стандарт unicode utf-8 или unicode utf-32le (смотря какой конкретный дистрибутив) и оба стандарта совместимы, а в Windows исторически сложилось Legacy разработка, настройка кодировки отображения идет в console cp866(Если вы используете русский диструбутив windows) а winapi использует code pages 1251(На русском дистрибутиве) в связи с этим у нас несколько путей решения:

    Сохранять исходные коды в cp866 чтобы компилятор или интерпретатор «вшивал» код символов для conosle windows по умолчанию.

Подменять шрифты где символы соответствуют кодировке cp866 то есть символ «А» в шрифте графически был на месте символа который выглядит как не «А». Например в нумерации кодировки для символа «А» cp866 это код 0x80, а для символа windows code pages 1251 0xc0 таким образом именно в шрифте нужно перерисовать символы где должны отображаться буква «А».

Подменять кодировку программно нужно написать небольшую функцию(процедуру) которая перехватывает весь поток вывода и подменяет символы на ту кодировку которая отображает символы по умолчанию это cp866.

  • Самый рациональный и простой метод это переключить операционную систему в нужную вам кодировку, для console windows это будет команда в самой консоле chcp 1251 для кодировки windows code pages 1251, а для unicode utf-8 соответственно chcp 65001 (список всех кодировок windows) для языка C++ можно написать команду после main system(«chcp 1251»);
  • Все эти советы актуальны для любой платформы (переключение кодировки самой консоли читайте в документации операционной системы), есть и более хитрые или изящные способы кодирования символов, но в данной статье-заметке кодировки рассмотрены с точки зрения операционных систем.

    Источник

    Как я боролся с кодировками в консоли

    В очередной раз запустив в Windows свой скрипт-информер для СамИздат-а и увидев в консоли «загадочные символы» я сказал себе: «Да уже сделай, наконец, себе нормальный кросс-платформенный логгинг!»

    Об этом, и о том, как раскрасить вывод лога наподобие Django-вского в Win32 я попробую рассказать под хабра-катом (Всё ниженаписанное применимо к Python 2.x ветке)

    Задача первая. Корректный вывод текста в консоль
    Симптомы

    До тех пор, пока мы не вносим каких-либо «поправок» в проинициализировавшуюся систему ввода-вывода и используем только оператор print с unicode строками, всё идёт более-менее нормально вне зависимости от ОС.

    Читайте также:  Asus k50ij camera driver windows 10

    «Чудеса» начинаются дальше — если мы поменяли какие-либо кодировки (см. чуть дальше) или воспользовались модулем logging для вывода на экран. Вроде бы настроив ожидаемое поведение в Linux, в Windows получаешь «мусор» в utf-8. Начинаешь править под Win — вылезает 1251 в консоли…

    Теоретический экскурс
    Ищем решение

    Очевидно, чтобы избавиться от всех этих проблем, надо как-то привести их к единообразию.
    И вот тут начинается самое интересное:

    Ага! Оказывается «система» у нас живёт вообще в ASCII. Как следствие — попытка по-простому работать с вводом/выводом заканчивается «любимым» исключением UnicodeEncodeError/UnicodeDecodeError .

    Кроме того, как замечательно видно из примера, если в linux у нас везде utf-8, то в Windows — две разных кодировки — так называемая ANSI, она же cp1251, используемая для графической части и OEM, она же cp866, для вывода текста в консоли. OEM кодировка пришла к нам со времён DOS-а и, теоретически, может быть также перенастроена специальными командами, но на практике никто этого давно не делает.

    До недавнего времени я пользовался распространённым способом исправить эту неприятность:

    И это, в общем-то, работало. Работало до тех пор, пока пользовался print -ом. При переходе к выводу на экран через logging всё сломалось.
    Угу, подумал я, раз «оно» использует кодировку по-умолчанию, — выставлю-ка я ту же кодировку, что в консоли:

    Уже чуть лучше, но:

    • В Win32 текст печатается кракозябрами, явно напоминающими cp1251
    • При запуске с перенаправленным выводом опять получаем не то, что ожидалось
    • Периодически, при попытке напечатать текст, где есть преобразованный в unicode символ типа ① ( ① ), «любезно» добавленный автором в какой-нибудь заголовок, снова получаем UnicodeEncodeError !

    Присмотревшись к первому примеру, нетрудно заметить, что так желаемую кодировку «cp866» можно получить только проверив атрибут соответствующего потока. А он далеко не всегда оказывается доступен.
    Вторая часть задачи — оставить системную кодировку в utf-8, но корректно настроить вывод в консоль.
    Для индивидуальной настройки вывода надо переопределить обработку выходных потоков примерно так:

    Этот код позволяет убить двух зайцев — выставить нужную кодировку и защититься от исключений при печати всяких умляутов и прочей типографики, отсутствующей в 255 символах cp866.
    Осталось сделать этот код универсальным — откуда мне знать OEM кодировку на произвольном сферическом компе? Гугление на предмет готовой поддержки ANSI/OEM кодировок в python ничего разумного не дало, посему пришлось немного вспомнить WinAPI

    … и собрать всё вместе:

    Задача вторая. Раскрашиваем вывод

    Насмотревшись на отладочный вывод Джанги в связке с werkzeug, захотелось чего-то подобного для себя. Гугление выдаёт несколько проектов разной степени проработки и удобности — от простейшего наследника logging.StreamHandler , до некоего набора, при импорте автоматически подменяющего стандартный StreamHandler.

    Попробовав несколько из них, я, в итоге, воспользовался простейшим наследником StreamHandler, приведённом в одном из комментов на Stack Overflow и пока вполне доволен:

    Однако, в Windows всё это работать, разумеется, отказалось. И если раньше можно было «включить» поддержку ansi-кодов в консоли добавлением «магического» ansi.dll из проекта symfony куда-то в недра системных папок винды, то, начиная (кажется) с Windows 7 данная возможность окончательно «выпилена» из системы. Да и заставлять юзера копировать какую-то dll в системную папку тоже как-то «не кошерно».

    Снова обращаемся к гуглу и, снова, получаем несколько вариантов решения. Все варианты так или иначе сводятся к подмене вывода ANSI escape-последовательностей вызовом WinAPI для управления атрибутами консоли.

    Побродив некоторое время по ссылкам, набрёл на проект colorama. Он как-то понравился мне больше остального. К плюсам именно этого проекта ст́оит отнести, что подменяется весь консольный вывод — можно выводить раскрашенный текст простым print u»\x1b[31;40mЧто-то красное на чёрном\x1b[0m» если вдруг захочется поизвращаться.

    Сразу замечу, что текущая версия 0.1.18 содержит досадный баг, ломающий вывод unicode строк. Но простейшее решение я привёл там же при создании issue.

    Собственно осталось объединить оба пожелания и начать пользоваться вместо традиционных «костылей»:

    Дальше в своём проекте, в запускаемом файле пользуемся:

    На этом всё. Из потенциальных доработок осталось проверить работоспособность под win64 python и, возможно, добаботать ColoredHandler чтобы проверял себя на isatty, как в более сложных примерах на том же StackOverflow.

    Источник

    unixforum.org

    Форум для пользователей UNIX-подобных систем

    • Темы без ответов
    • Активные темы
    • Поиск
    • Статус форума

    Локально поменять кодировку [решено]

    Модератор: Bizdelnick

    Локально поменять кодировку [решено]

    Сообщение entada » 02.04.2012 16:55

    Мне необходимо работать с файлами в кодировке 1251 (перекодировать в данном случае нельзя).
    Стандартные утилиты типа less, grep и т.д. с ними не работают, что очень обидно.

    Кодировка по умолчанию — utf-8, локаль русская, дистрибутивы — Debian Lenny или Squeeze.

    .
    А файлы в utf-8 показываются нормально.

    Как же мне сменить кодировку (не для всей системы, а только для одного эмулятора терминала)?

    Re: Локально поменять кодировку [решено]

    Смотрите документацию на свой эмулятор терминала, как его заставить понимать cp1251. Это может быть перекодирование средствами терминала, установка шрифтов, настройка leim, … В общем, см. документацию на эмулятор терминала. А less — просто выводит содержимой файла на терминал постранично, без перекодирования, независимо от локали, про шрифты less ничего не знает, но отлично работает с файлами практически в любой кодировке.

    Как вариант, вместо игр с локалью и шрифтами: $ iconv -f cp1251 /путь/к/файлу/в/cp1251 | less . Да, это перекодирование. Если Вам нельзя, потому что доктор запретил, тогда ой.

    Re: Локально поменять кодировку [решено]

    Сообщение yars » 02.04.2012 17:11

    Я так думаю, что вам кроме перечисленных вами операций, нужно еще указать консольный шрифт с поддержкой CP1251 в настройках эмулятора терминала, аналогично тому, как это делается для русификации консоли.

    Читайте также:  Виртуальная машина mac os для windows 10 virtualbox

    watashiwa_darede.
    Ой, вы мене опередили

    Источник

    Linux изменить кодировку консоли

    Библиотека сайта rus-linux.net

    3. Кириллизация текстового режима

    Кириллизация текстового режима — самый простой способ отображать и вводить символы кириллицы.

    Ниже я опишу способ, как «справиться» с драйвером Linux консоли. Поэтому, если вы пытаетесь русифицировать консоль в другой системе, то не ожидайте, что описанные приёмы будут в ней работать. Взамен проконсультируйтесь с руководством по драйверу терминала и пошлите мне любую информацию, которую вы найдёте. В этом случае я смогу включить её в дальнейшие версии этого документа.

    Для специфической информации, касающейся вашего дистрибутива, вам следует обратиться в раздел Кириллизация дистрибутивов.

    3.1 Консольный драйвер Linux

    Консольный драйвер Linux — прекрасный образец хорошо настраиваемого программного обеспечения. Он может менять как шрифты, так и раскладки клавиатуры. Для специфической информации, касающейся вашего дистрибутива, вам следует обратиться в раздел Кириллизация дистрибутивов.

    Чтобы настроить консоль, вы можете воспользоваться одним из двух описанных ниже пакетов: console-tools (См. раздел consoletools) или kbd (См. раздел kbd).

    В ранних версиях Linux альтернативы kbd не было, но в свежих дистрибутивах вместо kbd сейчас можно использовать пакет consoletools. Этот пакет кардинально отличается от своего предшественника — пакета kbd (например, в нем нет команды setfont — для совместимости используется эмулирующий скрипт).

    Чтобы проверить, какой из двух пакетов присутствует в вашей системе, следует попробовать выполнить команду consolechars . Если она успешно выполнилась — тогда у вас есть пакет console-tools; если же нет — у вас скорее всего имеется команда setfont и значит, установлен пакет kbd.

    Вам будет полезно знать общую схему работы консольного драйвера. Когда некоторая пользовательская программа запрашивает консольный драйвер вывести на экран символ, имеющий код А, то консольный драйвер сначала ищет код А в таблице ACM (Application Charset Map). Из таблицы он узнает, какой код Б согласно кодировке Unicode соответствует коду А. Вы определяете используемую вами кодировку посредством таблицы ACM. Далее консольный драйвер ищет код Б в таблице SFM Screen Font Map. Таблица SFM определяет кодировку используемого шрифта подобно тому, как ACM определяет вашу кодировку. От SFM консольный драйвер узнает, какой символ активного шрифта имеет код Б согласно Unicode и нужно вывести на экран.

    Существуют две важные модификации этой схемы.

    Аппаратные ограничения современных компьютеров не позволяют использовать шрифты, имеющие более 512 символов. Отсюда очевидно, что иногда консольный драйвер не сможет найти код Б в SFM. Тогда ему на помощь приходит так называемая fallback таблица. Эта таблица определяет для кода Б возможные его аппроксимации Б1, Б2. Например, если Б является код символа «левая двойная угловая кавычка», то возможно Б1 будет кодом символа «левая одинарная угловая кавычка», а Б2 будет просто кодом символа » graph.fallback , то он начнёт чертить окна подобно следующей картинке:

    На экране это выглядит не так уж и плохо.

    Второй важной модификацией общей схемы работы консольного драйвера является режим Unicode. Описанная выше схема относится к 8ми битовому режиму работы драйвера. Когда же он находится в режиме Unicode, то он ожидает, что пользовательские программы используют Unicode и ожидает получать от них коды символов согласно Unicode. Поэтому в этом режиме ACM не используется. Вы всегда можете переключать консольный драйвер из 8ми битового режима в Unicode и обратно посредством команд unicode_start и unicode_stop .

    Возможно, у вас появился следующий вопрос: а зачем нужна вся эта сложная процедура? Что, если я буду использовать шрифты, имеющие используемую мной кодировку? Это возможно, но возникают некоторые осложнения. Вам нужно сказать программам, что псевдографические символы в шрифте уже находятся на других местах. И даже если вы ухитритесь сделать это посредством специального терминального типа (как например linux-koi8r ), то появится вторая (уже неразрешимая) проблема — из-за аппаратных свойств VGA, горизонтальная псевдографика получится с разрывами, если символы псевдографики в шрифте не расположены на тех же позициях, что и в кодировке cp437 (расположение псевдографики в cp866 идентично cp437). Поэтому рекомендуется использовать шрифты, имеющие кодировку на основе cp437 (cp866).

    Прежде чем приступить к делу, разберёмся с 8-битовым режимом. Не всегда консольный драйвер Linux умел работать с Unicode. Конечно, тогда не существовали также и ACM, и SFM. Вместо них использовалась 8-битовая экранная таблица перекодировки (screen map). Это была просто таблица для перевода от одной кодировки (используемой программой) в другую (кодировку шрифта). Например, koi2alt.trans переводит коды KOI8-R в коды cp866. Для совместимости теперь 8-битовый screen map эмулируется с помощью специальной таблицы ACM.

    Установка кириллицы с помощью пакетов console-tools и kbd обычно состоит из:

    1. Настройки экранного шрифта и SFM. Это делается с помощью программы consolechars (пакет console-tools ) или setfont и mapscrn (пакет kbd ).
    2. Настройки ACM (или 8-битовой экранной таблицы перекодировки) и fallback-таблицы .
    3. Загрузки соответствующей раскладки клавиатуры с помощью программы loadkeys .

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

    Файлы шрифтов обычно находятся в каталогах /usr/share/consolefonts или /usr/lib/kbd/consolefonts, таблицы ACM, SFM и fallback в /usr/share/consoletrans, клавиатурные раскладки в /usr/share/keymap/i386/qwerty.

    Ниже описано, как установить русскую клавиатурную раскладку. Здесь не используется SFM и fallback таблиц, а вместо ACM используется 8-битовая экранная таблица перекодировки. Это делается в основном из-за того, что у имеющихся в kbd и console-tools шрифтов для cp866 нет таблиц SFM. Если вы хотите воспользоваться всеми возможностями консольного драйвера Linux и радоваться хорошим шрифтам, то используйте пакет console-tools-cyrillic Виктора Вагнера (См. раздел Cyrillic console tools).

    Читайте также:  Время загрузки windows 10 сколько

    3.2 consoletools

    Сам пакет можно найти по адресу console-tools .

    В том случае, если ваш дистрибутив использует пакет consoletools, вам необходимо выполнить следующие действия (естественно, эти команды не следует выполнять дословно):

    После выполнения этих команд и загрузки соответствующих файлов вы можете переключать раскладку клавиатуры для ввода кириллических символов с помощью правого Control (иногда переключение по умолчанию «вешается» на Alt или Caps Lock).

    К сожалению, шрифты и клавиатурные раскладки, поставляемые вместе с этими пакетами, не позволяют воспользоваться всеми возможностями консольного драйвера. Поэтому я рекомендую вам использовать пакет console-tools-cyrillic Виктора Вагнера (См. раздел Cyrillic console tools).

    3.3 Cyrillic console tools

    Этот пакет содержит кириллические консольные шрифты и таблицы перекодировки для Linux, а также раскладки клавиатуры и прочие полезные вещи. Последнюю версию этого пакета можно обнаружить по адресу ftp://ftp.ice.ru/pub/fonts/linux/. Этот пакет активно развивается Виктором Вагнером ( vitus@ice.ru).

    Для настройки следует первым делом следует прочитать файл README , который идёт в поставке. Для работы с пакетом необходимы утилиты consoletools (См. раздел consoletools), впрочем, экранные шрифты можно использовать и с последними kbd.

    Все шрифты сделаны на базе альтернативной кодировки (CP866). Почему? Потому что использование любой другой кодировки русских букв в качестве физической в текстовом режиме VGA приводит к тому, что горизонтальная псевдографика получается с разрывами. Это аппаратное свойство VGA, которое никак не лечится. Единственный выход — использовать шрифты, в которых псевдографика расположена на тех же позициях, что и в cp437.

    В пакет входят семь комплектов шрифтов различной степени пригодности и функциональности. Все шрифты содержат в себе таблицу отображения в unicode.

    В дистрибутив пакета включены кириллические таблицы перекодировки из распространенных кодировок русского, белорусского, болгарского, сербского и украинского языков в unicode. Использование этих таблиц перекодировок совместно со шрифтами, включёнными в этот пакет, позволяет вам настроить консоль в любую требуемую кодировку кириллицы.

    В пакет включена комплект для генерации клавиатуры, основанный на идеях, предложенных Кириллом Злобиным ( slobin@ice.ru). Раскладки клавиатуры получаются с помощью обработки препроцессором C ( /usr/bin/cpp ) файла кодировки и собственно файла раскладки. Использование макросов для описаний клавиш позволяет существенно полнее чем в большинстве распространенных раскладок определить комбинации Alt-клавиша, Ctrl-клавиша и т.д., как в русском, так и в латинском режимах.

    Для настройки консоли я использую команды:

    Для создания клавиатурной раскладки console_russian.map выполняю команду:

    Это microsoft раскладка, переключение осуществляется с помощью дополнительной клавиши Windows «клавиши системного меню».

    P.S. Для украинизации вместо koi8-r.acm надо подставить koi8-u

    3.4 kbd

    Довольно много дистрибутивов Linux устанавливают kbd как обязательную часть системы. Сам пакет доступен по адресу kbd .

    Пакет kbd содержит утилиты управления клавиатурой, кроме этого, с ним поставляется широкий выбор шрифтов и раскладок.

    Установка кириллицы с помощью kbd обычно состоит из:

      Загрузки соответствующей раскладки клавиатуры с помощью программы loadkeys . Практически в каждом дистрибутиве можно установить раскладку клавиатуры, которую система загружает по умолчанию во время загрузки, с помощью соответствующей программы настройки (например, для RedHat — это /usr/sbin/kbdconfig ). Вы также можете просто запустить loadkeys из вашего

    /.profile или сделать это руками.

  • Настройки экранного шрифта. Это делается с помощью программы setfont . Файлы шрифтов находятся в /usr/lib/kbd/consolefonts . ВНИМАНИЕ: В старых версиях Linux запуск программы setfont под X-Window мог завесить систему. Сейчас в этом случае печатается сообщение об ошибке.
  • Если вы являетесь приверженцем программ, работающих в текстовом режиме и использующих достоинства псевдографики PC (таких как Midnight Commander), то вы можете предпочесть использовать шрифты с CP866 кодировкой и консольной раскладкой (console character map). Это означает, что ваша консоль отображает CP866 шрифты, но все кириллические символы, соответствующие KOI8-R кодировки, соответственным образом отображаются в CP866 и поэтому выглядят правильно. Преимущество этого метода заключается в том, что он позволяет использовать псевдографические символы кодировки CP866 .

    Ниже перечислены команды, которые позволяют достичь этого эффекта.

    При русификации всех консолей при загрузке системы вместо строчки

    следует использовать строчку

    — это русифицирует все терминалы.

    Магическая последовательность необходима для перекодировки вывода символов на экран, если вы используете CP866 шрифты. Она работает, и этого достаточно для спокойной жизни. Однако, если вам любопытно, то посмотрите документацию к пакету kbd.

    3.5 Проверка правильности кириллизации консоли

    Теперь вы, вероятно, хотите проверить правильность кириллизации консоли.

    Соответствующим образом настройте bash (раздел bash) или tcsh (раздел tcsh) — этот шаг необходим, перегрузите его, затем нажмите правую клавишу Control . Удостоверитесь, что вы можете правильно печатать по-русски. Клавиша ‘ q ‘ должна соответствовать » й «, ‘ w ‘ соответствует » ц «, и т.д ( qwerty->йцукен ).

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

    Если у вас возникли непредвиденные проблемы, то лучше всего вернуться к родной (то есть US) раскладке. Для этого выполните следующие действия:

    ВНИМАНИЕ: В старых версиях Linux консольный драйвер не способен сохранить это состояние, когда передаётся управление X-Window. Следовательно, после того, как вы вышли из X (или переключаетесь на консоль), вы должны перезагрузить русский шрифт.

    3.6 Что делать, если «слетела» консоль?

    Скорее всего, на консоль был скопирован какой-то двоичный файл, где случайно встретилась переключающая ESC-последовательность. Тогда:

    набрать вслепую, или с работающей консоли:

    Переключение на downloaded font

    (возможно, ещё придётся перегрузить шрифты, но это смотря как консоль сорвало. )

    Если вывалилась какая-то программа, которая использует curses, то проще

    Источник

    Оцените статью