UTF-8/ru

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

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

История кодировок символов
Самой распространенной (или, по крайней мере, наиболее принятой повсеместно) кодировкой является ASCII (Американский стандартный код для обмена информацией, American Standard Code for Information Interchange). Часто считается, что ASCII &mdash; наиболее успешный программный стандарт из когда-либо созданных. Современный 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 видимы &mdash; это пробел, знаки препинания, латинские буквы и цифры.

Восьмой бит в 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
Теперь, когда принципы лежащие в основе Unicode были изложены, начнем использовать UTF-8 на локальной системе!

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

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

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

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

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

Настройка локали
There is one environment variable that needs to be set in order to use the new UTF-8 locales: LC_CTYPE (optionally modify the LANG variable to change the system language as well). There are also many different ways to set it; some system administrators prefer to only have a UTF-8 environment for a specific user, in which case they set them in their ( for Bourne shell users),  or  ( for Bourne again shell users). More details and best practices can be found in the Localization Guide.

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

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

Next, the environment must be updating by running the following command:

Now, run with no arguments to see if the correct variables have been loaded in the environment:

Alternatively, using eselect to set locales
Although it is good to maintain the system as described above, it is possible to verify the correct locale configured using the utility.

Use to list the available locales on the system:

Using setting the locale is as simple as listing them. Once the correct locale has been determined invoke:

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

In case it is preferred to have with   instead of , run the appropriate  command:

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

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

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

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

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

Avoid setting  to UTF-8; it is not recommended. Instead, pass the  option when mounting FAT partitions. For further information or see the appropriate kernel documentation at

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

The format of the command is as follows:

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

For changing the contents of files, use the utility, it comes bundled with  and should be installed on all Gentoo systems. Substitute iso-8859-1 with the charset being converted from. After running the command be sure to check for sane output:

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

Также для перекодировки может быть использован пакет.

Системная консоль
To enable UTF-8 on the console edit. Set  and read the comments -- it is important to have a font that has a good range of characters to make the most of Unicode. For this to work make sure the Unicode locale has been properly created.

The keymap variable, set in, should have a Unicode keymap specified.

Ncurses и Slang
It is wise to add to the global USE flags in, and then to re-emerge  and. Portage will do this automatically if the  or   options are used. Run the following command to pull in the packages:

We also need to rebuild packages that link to these, now the USE changes have been applied. The tool we use is part of the  package.

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

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

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

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

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

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

Terminal emulators that use Xft and support Unicode are harder to come by. Aside from Konsole and gnome-terminal, the best options in Portage are, , , , or plain when built with the   USE flag and invoked as. supports UTF-8 too, when invoked as or the following is put into the :

Vim, emacs, xemacs, and nano
Vim provides full UTF-8 support, and also has builtin detection of UTF-8 files. For further information in Vim, use.

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

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

Командные оболочки
Currently, provides full Unicode support through the GNU readline library. Z Shell offers Unicode support with the   USE flag.

The C shell, and  do not provide UTF-8 support at all.

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

For channels where non-ASCII characters are often exchanged in non-UTF-8 charsets, the command may be used to convert the characters. Type for more information.

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

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

Man
Man страницы являются неотъемлемой частью любой системы Linux. Чтобы удостовериться, что man страницы отображаются верно, отредактируйте и замените следующую строку.

links и elinks
These are commonly used text-based browsers, and we shall see how we can enable UTF-8 support on them. On and, there are two ways to go about this, one using the Setup option from within the browser or editing the config file. To set the option through the browser, open a site with or  and then + to enter the Setup Menu then select Terminal options, or press. Scroll down and select the last option  by pressing. Then Save and exit the menu. On one may have to do a repeat + and then press  to save. The config file option, is shown below.

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

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

Проверка работоспособности
Есть множество сайтов, использующих UTF-8. ,, , и все браузеры, основанные на движке Mozilla (включая Firefox), поддерживают UTF-8. Konqueror и Opera тоже полностью поддерживают UTF-8.

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

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


 * unicode-table.com
 * Тестовая страница UTF-8 W3C
 * Тестовая страничка UTF-8 от Университета Франкфурта

Ссылки

 * Статья в Википедии про Юникод (ru)
 * Статья в Википедии про UTF-8 (ru)
 * Unicode.org
 * UTF-8.com
 * RFC 3629
 * RFC 2277
 * Символы и байты
 * Локали и Интернационализация

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