кодировка на сервере linux
Как я боролся с кодировками в консоли
В очередной раз запустив в Windows свой скрипт-информер для СамИздат-а и увидев в консоли «загадочные символы» я сказал себе: «Да уже сделай, наконец, себе нормальный кросс-платформенный логгинг!»
Об этом, и о том, как раскрасить вывод лога наподобие Django-вского в Win32 я попробую рассказать под хабра-катом (Всё ниженаписанное применимо к Python 2.x ветке)
Задача первая. Корректный вывод текста в консоль
Симптомы
До тех пор, пока мы не вносим каких-либо «поправок» в проинициализировавшуюся систему ввода-вывода и используем только оператор print с unicode строками, всё идёт более-менее нормально вне зависимости от ОС.
«Чудеса» начинаются дальше — если мы поменяли какие-либо кодировки (см. чуть дальше) или воспользовались модулем logging для вывода на экран. Вроде бы настроив ожидаемое поведение в Linux, в Windows получаешь «мусор» в utf-8. Начинаешь править под Win — вылезает 1251 в консоли…
Теоретический экскурс
Ищем решение
Очевидно, чтобы избавиться от всех этих проблем, надо как-то привести их к единообразию.
И вот тут начинается самое интересное:
Кроме того, как замечательно видно из примера, если в linux у нас везде utf-8, то в Windows — две разных кодировки — так называемая ANSI, она же cp1251, используемая для графической части и OEM, она же cp866, для вывода текста в консоли. OEM кодировка пришла к нам со времён DOS-а и, теоретически, может быть также перенастроена специальными командами, но на практике никто этого давно не делает.
До недавнего времени я пользовался распространённым способом исправить эту неприятность:
… и собрать всё вместе:
Задача вторая. Раскрашиваем вывод
Попробовав несколько из них, я, в итоге, воспользовался простейшим наследником 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.
Linux: смена языка и кодировки системы
Раскладка клавиатуры для консоли
OpenRC
Файл Установка раскладки клавиатуры для консоли
systemd
В systemd раскладка для консоли может быть установлена с помощью команды localectl. Сперва проверьте доступные раскладки:
Далее установите необходимую раскладку для консоли:
В конце проверьте, что раскладка для консоли была установлена правильно:
Примечание 3 (настройка мс)
2. Check which system locales are enabled
Before setting up a different system locale you can first check which locales are enabled and ready to use on your Debian 9 VPS. You can use the following command for that purpose:
The output should be similar to the one below:
3. Generate a system locale for the region you need
If you don’t have the locale that you need to be enabled on your system, it can simply be generated by using the command. Just run the following command to generate a locale for the region you need:
debian set locale
Once you press you should see the following output:
Red Hat / CentOS
Включение системных средств локализации в Red Hat Linux (а, следовательно, и в других дистрибутивах, основанных на Red Hat) осуществляется из файла /etc/profile.d/lang.sh.
Как известно, при старте любого shell-а сначала выполняется /etc/profile. В Red Hat в /etc/profile прописаны команды, благодаря которым на исполнение вызываются также все файлы /etc/profile.d/*.sh
Значения переменных локализации в файлах lang.sh задаются путем вызова на выполнение файла /etc/sysconfig/i18n.
Чтобы изменения принялись нужно перезайти в консоль или выполнить команду source для файла в котором вы прописали export
Risoluzione dei problemi
Il mio terminale non supporta UTF-8
Sfortunatamente alcuni terminali non supportano UTF-8. In questo caso dovreste utilizzare un terminale differente. Questa è una lista di alcuni terminali che hanno il supporto per UTF-8:
Gnome-terminal o rxvt-unicode non supportano UTF-8
È necessario avviare queste applicazioni da un locale UTF-8 o cadrà il supporto ad UTF-8. Abilitare il locale (o il vostro locale UTF-8 alternativo) come spiegato precedentemente e impostarlo come la lingua predefinita, quindi riavviare.
Navigation menu
Our experts are sharingtheir knowledge with you.
Categories
► Modular Server Ethernet Switch
► Linux Software RAID
► Windows Server 2012
► Windows Server 2016
► Windows Server 2019
► OPNsense Business Edition
► Server Hardware Archive
Configuración del locale de todo el sistema
Nota: El archivo no existe por defecto, hay que crearlo manualmente.
Sugerencia: Si la salida de durante la instalación es de su agrado, puede guardarla haciendo: mientras se encuentra en el entorno chroot.
He aquí un ejemplo de configuración avanzada:
Consulte y para más detalles.
La configuración regional de todo el sistema estará completamente actualizada después de reiniciar y quedará establecida para las sesiones individuales iniciadas.
5. Changing your locale manually
Editing the locale file is very easy. You can use your favorite text editor to edit the file. If this file does not exist, then no locale is currently set for your system. You can create one manually and enable a locale for your system. The output below shows how the file should look like:
Replace with the locale you wish to have active on your system and save the file. Once you save the file, log out from your current session and then log back in, or open a new terminal, and your newly chosen locale will be active.
NOTE: This example file only sets the variable for your system, which covers the locale for all parts of the system.
Impostare il locale a livello di sistema
Per definire il locale a livello di sistema utilizzato sul sistema, impostare la variabile in :
Nota: non esiste per impostazione predefinita e va creato manualmente.
Suggerimento: Se l’output del locale è di vostro gradimento durante l’installazione, è possibile salvare un po ‘di tempo eseguendo : mentre si è ancora in ambiente chroot.
Ecco un esempio di configurazione avanzata:
Si veda e per maggiori dettagli.
Локали в Windows
Для того, чтобы узнать, какие локали доступны в Windows, нужно зайти в панель управления, «Язык и региональные стандарты».
На вкладке «Дополнительно», в разделе «Кодовые страницы таблиц преобразования» показан список всех возможных локалей для Windows, которые можно использовать в PHP. Кодовые страницы, которые отмечены в списке, из PHP могут быть использованы по их номеру. В общем случае, использование выглядит по следующей схеме: Для России это может выглядеть как (cp1251) или (KOI8-R). Для Украины — (cp1251). Единственная кодировка, с которой у меня возникли проблемы, как ни странно, оказалась UTF-8. При попытке выставить эту кодировку, выставляются все категории локалей, кроме основной. Вывод локализованных сообщений при этом идёт в cp1251. Пока это можно списать на внутренний механизм PHP работы со строками. С шестой версии PHP вся обработка строк должна будет вестись в UTF-8, но до тех пор надо просто знать об этом и делать поправку. Код — установка локали на Windows Navigation menuOur experts are sharingtheir knowledge with you. Как сменить locale в Debian или пишем кириллицей в консоли linuxЯ знаю что кириллица в логах Linux – это самый страшный грех для айтишника, но иногда это просто необходимость. Одна из таких необходимостей возникает при создании централизованного хранения log-файлов различных операционных систем. Microsoft всегда в своих log`ах применяет кириллицу и поэтому если мы хотим получать log-файлы и от Win-серверов, то стоит смириться, что в log`ах будет кирилица. Для того, чтобы эти логи нормально отображались нам и нужно явно указать locale в Debian, Ubuntu или какой Linux-дистрибутив Вы используете. Чтобы добавить кириллицу, чтобы Linux сервер нормально отображал русские буквы, нужно объяснить ему, что необходимо работать в той же кодировке, что и Windows. Для того, чтобы управлять локалью в Linux, необходим пакет locales, который должен быть у Вас установлен. В большинстве случаев пакет locales уже будет у Вас установлен, поэтому для проформы просто проверяем этот факт. Посмотреть установленную locale linux можно командой: Для ручного указания кодировке в Linux Mint, Debian или ubuntu нужно отредактировать конфигурационный файл /etc/locale.gen : Команду sudo не нужна, если Вы зашли как суперпользователь. Это относится к Linux Mint и Ubuntu, так как Debian ничего не знает о команде sudo. Стоит обратить внимание, что первые 2 символа (в нашем примере это ru) говорят нам о языке локализации (кириллица). После этого переопределяем настройки locales командой: Команда locale-gen позволяет запустить скрипт /etc/locale.gen и перечитывает все кодировки для консоли. Чтобы увидеть кириллицу в консоли Linux, остается только перелогиниться. КомментарииПопробую применить ваши методы, не знаю, что из этого выйдет, но просмотрим. Записки IT специалистаТехнический блог специалистов ООО»Интерфейс» Настройка языка и региональных стандартов в Ubuntu Server/Debian
Это, в первую очередь, поддержка символов национального алфавита, кодовых страниц и раскладок клавиатуры, форматов чисел, а также настроек даты и времени. Если данные настройки не выполнить или выполнить неправильно, то имена файлов и содержимое документов с использованием символов отличных от стандартного латинского алфавита могут быть искажены или испорчены. Также масса проблем может возникнуть в дальнейшем, например, при переходе на локализованную систему, когда имена уже существующих файлов или ссылок на них могут оказаться неверными или вовсе недействительными. Ниже на рисунке прекрасный пример того, что бывает, если на нелокализованный сервер скриптом были залиты файлы с именами, содержащими национальные символы, в данном случае кириллицу.
Поэтому, самым правильным решением будет сразу же настроить сервер на работу с нужной локализацией и снять целый пласт потенциальных проблем, тем более, что сделать это несложно. DebianДля правильного отображения символов национальных алфавитов в определенной кодировке в Linux-системах предназначены локали (locales), узнать какие локали уже установлены в системе можно командой: Обычно установлена и используется английская локаль en_US.utf8, однако, если вы, например, приобрели VPS в Германии, может присутствовать только национальная локаль, в этом случае, кроме русской, также рекомендуется установить английскую локаль.
Откроется псевдографическая утилита, которая предложит выбрать используемые локали, добавляем ru_RU.utf8
Прежде всего зададим кодировку консоли, в современном Linux это UTF-8.
Следующим шагом следует настроить клавиатуру: Выбираем тип клавиатуры, по умолчанию это 105-клавишная международная, менять эту настройку без особой необходимости не следует.
И устанавливаем текущий часовой пояс, после чего система автоматически переведет часы. Ubuntu ServerВ Ubuntu Server команда dpkg-reconfigure locales не имеет псевдографического интерфейса и при запуске настраивает уже сгенерированные локали. Поэтому придется нужные настройки выполнить вручную, прежде всего сгенерируем русскую локаль (здесь и далее обращаем внимание на регистр команд): Затем зададим локаль по умолчанию: После чего выполним их настройку:
Здесь все настройки аналогичны Debian, выбираем кодировку, набор символов и настраиваем шрифты. Теперь можно выйти и повторно войти в систему (или перезагрузиться), чтобы продолжить дальнейшую настройку на русском языке. Для полноценной локализации потребуется настроить клавиатуру: Мы не будем подробно останавливаться на настройках, так как работа этой утилиты подробно описана выше, в разделе о Debian.
Как видим, локализация системы не представляет абсолютно никакой сложности и выполняется в считанные минуты, позволяя снять целый ряд потенциальных проблем, решить которые впоследствии будет гораздо труднее. Дополнительные материалы:Помогла статья? Поддержи автора и новые статьи будут выходить чаще: Или подпишись на наш Телеграм-канал: Кракозябры в консоли Ubuntu/Debian
Пара примеров из того же Wiki: А теперь перейдём к решению. Для редактирования отображения симвлов в консоли существует специальный конфигуратор который запускается такой командой: Далее все действия производятся в консольном графическом конфигураторе простым выбором необходимых пунктов с помощью кнопок вверх, вниз и “Enter”. Для того, чтобы наша настройка не слетела после перезагрузки нужно проделать следующее: В открывшемся текстовом файле находим exit 0 и над этой строкой пишем: Спасибо за прочтение! Если этот пост помог вам, и вы хотели бы показать свою поддержку, подумайте о том, чтобы заправить будущие посты, купив мне чашку кофе!
|