UTF-8

From Gentoo Wiki
Jump to: navigation, search
This page is a translated version of the page UTF-8 and the translation is 100% complete.

Other languages:
English • ‎español • ‎français • ‎italiano • ‎日本語 • ‎한국어 • ‎русский


Resources

UTF-8 — это кодировка символов переменной длины, что, в данном случае, означает длину от 1 до 4 байт на символ. Первый байт UTF-8 используется для кодирования ASCII, что означает, что данный набор символов полностью обратно совместим с ASCII. UTF-8 означает, что символы ASCII и Latin полностью взаимозаменяемы с небольшим увеличением размера данных, так как используется только первый байт. Пользователи восточных алфавитов, например, японского, которым назначили диапазон с большим числом байт несчастливы, так как это приводит к 50%-й избыточности в их данных.

Кодировки символов

Что такое кодировка символов?

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

История кодировок символов

Самой распространенной (или, по крайней мере, наиболее принятой повсеместно) кодировкой является ASCII (Американский стандартный код для обмена информацией, American Standard Code for Information Interchange). Часто считается, что ASCII — наиболее успешный программный стандарт из когда-либо созданных. Современный ASCII стандартизован в 1986 году (ANSI X3.4, RFC 20, ISO/IEC 646:1991, ECMA-6) Американским национальным институтом по стандартизации (American National Standards Institute, ANSI).

ASCII является строго семибитной кодировкой, из чего следует, что она использует семь двоичных цифр, то есть интервал от 0 до 127. ASCII начинается с 32 невидимых управляющих символов (с кодами от 0 до 31) и заканчивается управляющим символом DEL (или delete) с кодом 127. Символы в диапазоне от 32 до 126 видимы — это пробел, знаки препинания, латинские буквы и цифры.

Восьмой бит в ASCII изначально использовался как бит контроля четности для проверки ошибок при передаче информации. Если проверка на ошибки не важна, то он остается равным 0. Это означает, что в ASCII каждый символ занимал один байт.

Хотя ASCII было достаточно для передачи информации на английском, для других европейских языков, содержащих символы с ударениями, это было не так просто. Для них был разработаны стандарты семейства ISO 8859. Они были обратно совместимы с ASCII, но использовали восьмой бит для дополнения таблицы дополнительными 127 символами для каждой кодировки. Скоро стали видны и ограничения ISO 8859. На данный момент существует 15 вариантов стандарта ISO 8859 (от 8859-1 до 8859-15). Однако для каждого символа вне ASCII-совместимого диапазона между этими стандартами возникал конфликт. Чтобы еще больше усилить конфликт между различными кодировками, для восточноевропейских языков корпорацией Microsoft был введен набор Windows-1252, использованный в ранних версиях Windows. Этот набор является надстройкой ISO 8859-1, обладающий собственными изменениями. Однако все же эти наборы были совместимы с ASCII.

Необходимость разработки совершенно отличных от ASCII однобайтовых кодировок для нелатинских алфавитов, как например EUC (Extended Unix Coding), используемый в японском и корейском (и в меньшей степени китайском) алфавитах, породила еще большую неразбериху с кодировками. Ряд операционных систем все еще использует различные наборы символов для одного и того же языка, например японские Shift-JIS и ISO-2022-JP. А пользователи, желающие видеть кириллицу, вынуждены были выбирать между KOI8-R (для русского и болгарского языков) и KOI8-U (для украинского языка), неудачной ISO 8859-5 и популярной Windows-1251. Все три семейства кодировок не полностью совместимы с ASCII. Хотя надо отметить, в KOI8 фонетически созвучные кириллические символы расположены так же, как и латинские, благодаря чему даже при отбрасывании восьмого бита текст оставался читабельным в ASCII-терминалах в виде транслита.

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

Что такое Юникод?

Юникод отбрасывает лимит традиционных однобайтовых кодировок. Он использует 17 "плоскостей", содержащих по 65,536 кодов символов. Таким образом, максимальное возможное число символов равно 1,114,112. Поскольку в первой плоскости ("Basic Multilingual Plane" или BMP) содержится почти всё, что может понадобиться, многие ошибочно посчитали, что Юникод это 16-битный набор символов.

Юникод реализован несколькими способами, но распространены только два UTF (Unicode Transformation Format) и UCS (Universal Character Set). Число после UTF обозначает число бит на каждый символ, когда как число после UCS обозначает число байт. UTF-8 стала наиболее распространенной при обмене текста Юникод из-за своей явной ориентированности на размер в 8 бит; поэтому является основной темой данного документа.

Что UTF-8 может сделать

UTF-8 позволяет пользователям работать в совместимой со всеобщими стандартами и принятой по всему миру многоязычной среде, правда с небольшим увеличением размера данных. Это наилучший способ для передачи не-ASCII символов через интернет, будь то электронная почта, IRC-сети или что-нибудь еще. Несмотря на это, множество людей расценивают использование UTF-8 при передаче данных неприличным и неуважительным. Всегда следует выяснять, поддерживает ли определенный канал, группа Usenet или список рассылки UTF-8 перед тем, как использовать символы из не-ASCII диапазона UTF-8.

Включение UTF-8 в Gentoo Linux

Поиск или создание локалей UTF-8

Теперь, когда принципы лежащие в основе Unicode были изложены, начнем использовать UTF-8 на локальной системе!

Пользователям, которым нужна более детальная информация, могут найти ее в статье Руководство по локализации Gentoo.

Далее, нужно определить, доступна ли локаль UTF-8 для нашего языка или придется создать её.

user $locale -a | grep 'en_GB'
en_GB
en_GB.utf8

На выходе этой команды мы должны получить хотя бы одну строку, содержащую суффикс .utf8. Если таковых нет, то нам придётся создать локаль, совместимую с UTF-8.

Заметка
Запускайте следующую команду, если в система не имеет UTF-8 локали для выбранного языка.

Замените "en_GB", если нужна какая-то другая локаль:

root #localedef -i en_GB -f UTF-8 en_GB.UTF-8

Другим способом включить локаль UTF-8 является добавление её в файл /etc/locale.gen и генерация нужных локалей, используя команду locale-gen. Локали будут записаны в архив локалей /usr/lib/locale/locale-archive.

Код Строка в /etc/locale.gen
en_GB.UTF-8 UTF-8
root #locale-gen
 * Generating 1 locales (this might take a while) with 1 jobs
 *  (1/1) Generating en_GB.UTF-8 ...                            [ ok ]
 * Generation complete

Настройка локали

Есть одна переменная среда, которую необходимо настроить, чтобы использовать UTF-8 локали: LC_CTYPE (также, можно изменить переменную LANG, чтобы изменить системный язык). Есть множество способов сделать это. Некоторые системные администраторы предпочитают использовать UTF-8 только для определенного пользователя, поэтому они устанавливают эту переменную в своём ~/.profile (/bin/sh> для пользователей Bourne shell), ~/.bash_profile или ~/.bashrc (/bin/bash для пользователей Bourne again shell). Больше информации, а также наилучшие способы локализации можно найти в Руководстве по локализации.

Другие же предпочитают установить локаль глобально. Есть по крайней один весомый аргумент в пользу этого подхода - при использовании /etc/init.d/xdm, так как init-скрипт запускают диспетчер окон до того, как будут загружены конфигурационные файлы командной оболочки. Другими словами, это выполняется до того момента, как какие-либо переменные попадут в окружение пользователя.

Настройка локали глобально делается с помощью файла /etc/env.d/02locale. Он должен выглядеть следующим образом:

Код Демонстрация /etc/env.d/02locale
## (Как обычно, замените "en_GB.utf8" соответствующее значение локали; каждый язык имеет своё значение!)
LANG="en_GB.utf8"
Заметка
Можно использовать LC_CTYPE вместо переменной LANG. За дополнительными сведениями о категориях, на которые влияет использование LC_CTYPE, обращайтесь к странице локалей GNU.

Далее, следует обновить среду переменных, запустив следующую команду:

root #env-update
>>> Regenerating /etc/ld.so.cache...
root #source /etc/profile

Теперь запустите locale без аргументов, чтобы увидеть, что верные переменные были загружены в окружающую среду переменных:

root #locale
LANG=en_GB.utf8
LC_CTYPE="en_GB.utf8"
LC_NUMERIC="en_GB.utf8"
LC_TIME="en_GB.utf8"
LC_COLLATE="en_GB.utf8"
LC_MONETARY="en_GB.utf8"
LC_MESSAGES="en_GB.utf8"
LC_PAPER="en_GB.utf8"
LC_NAME="en_GB.utf8"
LC_ADDRESS="en_GB.utf8"
LC_TELEPHONE="en_GB.utf8"
LC_MEASUREMENT="en_GB.utf8"
LC_IDENTIFICATION="en_GB.utf8"
LC_ALL=

Альтернативный метод: использование eselect для настройки локали

То, что было написано выше, достаточно, чтобы хорошо настроить систему, можно также проверить правильность настройки локали с помощью утилиты eselect.

Используйте команду eselect, чтобы получить список доступных локалей в системе:

root #eselect locale list
  [1] C
  [2] POSIX *
  [3] en_GB.utf8
  [ ] (free form)

Утилита eselect выводит список локалей. После того, как нужная локаль была определена, активируйте ее:

root #eselect locale set 3
Setting LANG to en_GB.utf8 ...

Проверим результат:

root #eselect locale list
  [1] C
  [2] POSIX
  [3] en_GB.utf8 *
  [ ] (free form)

В случае предпочтения использовать .UTF-8 заместо .utf8 в /etc/env.d/02locale, запустите соответствующую команду eselect:

root #eselect locale set en_GB.UTF-8
Setting LANG to en_GB.UTF-8 ...
root #eselect locale list
  [1] C
  [2] POSIX
  [3] en_GB.utf8
  [4] en_GB.UTF-8 *
  [ ] (free form)

Запуск следующей команды обновит переменное окружение для shell:

root #env-update && source /etc/profile
>>> Regenerating /etc/ld.so.cache...

Вот и всё. Теперь система использует локаль UTF-8. Следующим этапом будет настройка повседневно используемых приложений.

Поддержка приложениями

Когда Юникод делал первые шаги в мире программного обеспечения, многобайтовые кодировки были плохо совместимы с таким языком программирования как C, на котором написаны многие из часто используемых программ. Даже сейчас некоторые программы не способны работать с UTF-8 как надо. К счастью, большинство распространенных программ поддерживают Юникод.

Имена файлов, NTFS и FAT

В конфигурационном меню ядра Linux есть множество параметров NLS, но главное не паниковать. В большинстве случаев всё, что нужно это включить поддержку UTF-8 NLS в ядре и изменить переменную NLS со значения по умолчанию на utf8.

Ядро Шаги настройки UTF-8 NLS для ядра
File Systems -->
  Native Language Support -->
    (utf8) Default NLS Option
    <*> NLS UTF8
    ## (Также пометьте <*> другие наборы символов, которые используются
    в файловой системе FAT или Joilet для CD-ROM.)

Если требуется подключить разделы NTFS, то пользователю при подключении понадобиться указать специальный параметр nls=. Если требуется смонтировать разделы FAT, нужно указать при монтировании параметр codepage=. Также можно установить для FAT кодовую страницу по умолчанию при конфигурации ядра.

Заметка
Помните, что параметр codepage, указанный вместе с командой mount, будет иметь приоритет над настройками ядра.
Ядро Настройки FAT в конфигурации ядра
File Systems -->
  DOS/FAT/NT Filesystems  -->
    (437) Default codepage for fat

Не устанавливайте Default iocharset for fat в UTF-8, так как это не рекомендуется. Вместо этого укажите параметр utf8=true при монтировании раздела FAT. Для более детальной информации, смотрите man mount или смотрите соответствующую документацию ядра расположенную в /usr/src/linux/Documentation/filesystems/vfat.txt.

Чтобы сменить кодировку имен файлов, используйте app-text/convmv.

root #emerge --ask app-text/convmv

Команда convmv имеет следующий формат:

root #convmv -f <текущая кодировка> -t utf-8 <имя файла>

Замените iso-8859-1 кодировкой, с которой хотите конвертировать:

root #convmv -f iso-8859-1 -t utf-8 имя_файла

Для изменения содержимого файлов, используйте утилиту iconv, поставляемую вместе с sys-libs/glibc и уже должна быть установлена в системе Gentoo. Замените iso-8859-1 кодировкой, с которой хотите конвертировать. После запуска команды убедитесь в нормальном выходе:

root #iconv -f iso-8859-1 -t utf-8 имя_файла

Чтобы конвертировать файл, нужно создать другой файл:

root #iconv -f iso-8859-1 -t utf-8 имя_файла > новый_файл

Также для перекодировки может быть использован пакет (app-text/recode).

Системная консоль

Для поддержки консолью локали UTF-8 нужно отредактировать /etc/rc.conf. Установите переменную UNICODE="yes" и прочтите комментарии в этом файле -- важно, чтобы в системе были шрифты с нужным диапазоном символов, если хотите выжать из Юникода всё. Чтобы это сработало, удостоверьтесь, что локаль Unicode была правильно создана.

В файле /etc/conf.d/keymaps переменная KEYMAP должна соответствовать раскладке Unicode.

Код Выдержка из /etc/conf.d/keymaps
## (Замените uk на любимую раскладку)
keymap="uk"

Ncurses и Slang

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

Будет хорошим решением добавить unicode к глобальным USE-флагам в файле /etc/portage/make.conf, а затем при необходимости пересобрать sys-libs/ncurses и sys-libs/slang. Portage это сделает автоматически при обновлении системы, если он был запущен с опциями --changed-use или --newuse. Запустите следующую команду чтобы обновить пакеты:

root #emerge --update --deep --newuse @world

Также понадобится пересобрать пакеты, зависящие от них, чтобы изменения USE вступили в силу. Используемая утилита (revdep-rebuild) входит в пакет app-portage/gentoolkit.

root #revdep-rebuild --soname libncurses.so.5
root #revdep-rebuild --soname libslang.so.1

KDE, GNOME и Xfce

Все основные графические оболочки полностью совместимы с Юникодом и не требуют дополнительной настройки, кроме той, что описана в этом документе. Все это благодаря тому, графические библиотеки (Qt и GTK+2) совместимы с UTF-8. Следовательно, все приложения, работающие на основе этих библиотек, также должны поддерживать UTF-8 без дополнительных настроек.


У приложений написанных на GTK+, для ввода шестнадцатеричного Юникода нужно ввести Ctrl+Shift+u+<hex digit>. Например, символ Юникода ✔ , у которого Юникод номер U+2714, может быть введен как Ctrl+Shift+u+2714+ENTER, что после преобразования станет .


Исключением в этом правиле является Xlib и GTK+1. GTK+1 требует iso-10646-1 FontSpec в ~/.gtkrc, например -misc-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1. Также приложения, использующие Xlib или Xaw, нуждаются в подобной FontSpec, иначе они не буду работать.

Заметка
Если старая версия центра управления GNOME 1 доступна, используйте ее. Воспользуйтесь любым из шрифтов семейства iso10646-1.
Код Пример ~/.gtkrc (для GTK+1), определяющий Юникод-совместимый шрифт
style "user-font"
{
    fontset="-misc-fixed-*-*-*-*-*-*-*-*-*-*-iso10646-1"
}
widget_class "*" style "user-font"

Если приложение одинаково поддерживает Qt и GTK+2, то обычно GTK+2 GUI выдает лучшие результаты при работе с Юникодом.

X11 и шрифты

Шрифты TrueType обычно совместимы с Юникодом, и большинство шрифтов, поставляемых с Xorg, имеют поддержку большинства кодировок, хотя не все глифы Юникода могут быть отображены для конкретного шрифта.

Также множество пакетов шрифтов в Portage совместимы с Юникодом. Смотрите страницу Fontconfig для более подробной информации о рекомендуемых шрифтах и настройках.

Диспетчеры окон и эмуляторы терминалов

Диспетчеры окон, не использующие GTK+ или Qt, обычно очень хорошо поддерживают Юникод, так как чаще всего для отображения шрифтов используют библиотеку Xft. Если диспетчер окон не использует Xft, то еще возможно использовать FontSpec, указанный в предыдущем разделе в качестве шрифта Юникода.

Эмуляторы терминала, использующие Xft и поддерживающие Юникод найти сложнее. Кроме Konsole и gnome-terminal, лучшим выбором в Portage будет x11-terms/rxvt-unicode, x11-terms/xfce4-terminal, gnustep-apps/terminal, x11-terms/mlterm или просто x11-terms/xterm, собранный с USE-флагом unicode и запускаемый как uxterm. app-misc/screen тоже поддерживает UTF-8, если запускается с параметром screen -U, или в файле ~/.screenrc есть следующая строчка:

Код ~/.screenrc для UTF-8
defutf8 on

Vim, emacs, xemacs и nano

Vim полностью поддерживает UTF-8 и к тому же автоматически определяет файлы с UTF-8. Для более детальной информации используйте в Vim :help mbyte.txt.

GNU Emacs с версии 23 и XEmacs версии 21.5 имеют полную поддержку UTF-8. GNU Emacs 24 также поддерживает редактирование текста в обоих направлениях.

Nano полностью поддерживает UTF-8 начиная с версии 1.3.6.

Командные оболочки

На данный момент bash полностью поддерживает Юникод через библиотеку GNU readline. Z Shell (zsh) поддерживает Unicode при использовании USE-флага unicode.

Оболочки C, tcsh и ksh не поддерживают UTF-8.

Irssi

Irssi полностью поддерживает UTF-8, хотя для этого требуется дополнительная настройка пользователем.

[irssi]set term_charset UTF-8

Для каналов, где не-ASCII символы чаще всего передаются в не-UTF-8 кодировках, может пригодиться команда /recode для перекодировки символов. Наберите /help recode для большего количества информации.

Mutt

Почтовый агент Mutt очень хорошо справляется с Юникодом. Чтобы использовать UTF-8 в Mutt, не надо что-либо добавлять в конфигурационные файлы. Mutt будет работать с Юникодом без модификаций, при условии, что все конфигурационные файлы (включая подпись) сохранены в UTF-8.

Заметка
Если всё ещё видите '?' в письмах при чтении с помощью Mutt? Это случается из-за того, что некоторые люди используют почтовые клиенты, которые не указывают используемую кодировку письма. Мало что можно сделать в этом случае, кроме как попросить их правильно настроить свои клиенты.

Для более детальной информации смотри Mutt Wiki.

Man

Man-страницы являются неотъемлемой частью любой системы Linux. Чтобы удостовериться, что man-страницы отображаются верно, отредактируйте /etc/man.conf и замените следующую строку. Это нужно только в том случае, когда используется sys-apps/man, для sys-apps/man-db не нужно.

Код Изменения man.conf для поддержки Юникода
## (Это старая строка)
NROFF           /usr/bin/nroff -Tascii -c -mandoc
## (Замените ее этой)
NROFF           /usr/bin/nroff -mandoc -c

links и elinks

Это самые популярные текстовые браузеры, и вы узнаете, как установить поддержку UTF-8 для них. В elinks и links есть два способа сделать это — через меню Setup (Установки) браузера или отредактировав конфигурационный файл. Чтобы настроить параметры в самом браузере, откройте какой-нибудь сайт с помощью elinks или links и нажмите Alt+S для входа в меню настроек (Setup Menu), после чего выберите параметры терминала (Terminal options), или нажмите T. Пролистайте вниз и выберите последний параметр UTF-8 I/O, нажав на Enter. Затем сохраните и выйдите из меню. В links можно сделать тоже самое, нажав Alt+S, а затем S для сохранения. Пример конфигурационного файла показан ниже.

Код Включение UTF-8 в elinks/links
## (Для elinks добавьте в /etc/elinks/elinks.conf или ~/.elinks/elinks.conf следующую строку)
set terminal.linux.utf_8_io = 1
## (Для links, добавьте в ~/.links/links.cfg следующую строку)
terminal "xterm" 0 1 0 us-ascii utf-8

Samba

Samba это набор программ, реализующих протокол SMB (Server Message Block) для UNIX-систем (Mac, Linux и FreeBSD). Этот протокол также иногда упоминается как Common Internet File System (CIFS). Samba содержит также систему NetBIOS, используемую для предоставления доступа к файлам в Windows-сетях.

Добавьте следующие строки в раздел [global]:

root #nano -w /etc/samba/smb.conf
dos charset = 1255
unix charset = UTF-8
display charset = UTF-8

Проверка работоспособности

Есть множество сайтов, использующих UTF-8 и большинство популярных веб-браузеров в Gentoo полностью поддерживают UTF-8.

При использовании текстовых браузеров, удостоверьтесь, что используется совместимый с Юникодом терминал.

Если некоторые символы отображаемые как квадратики с буквами или цифрами внутри, то это значит, что в текущем шрифте нет соответствующего символа или глифа для этого символа. Вместо этого, он отображает квадрат с шестнадцатеричным кодом символа UTF-8.

Известные проблемы

Системные конфигурационные файлы (в /etc)

Большинство системных конфигурационных файлов (например, /etc/fstab) не поддерживают UTF-8. Рекомендуется придерживаться набора символов ASCII при работе с этими файлами.

Внешние ресурсы