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

Поиск или создание локалей UTF-8
Теперь, когда вы поняли основы Юникода, вы готовы начать использование UTF-8 в вашей системе.

Главным требованием для UTF-8 является наличие установленной библиотеки glibc с поддержкой национального языка. При этом рекомендуется использовать файл. Описание использования этого файла, однако, выходит за рамки данного документа. Его использование описано в Руководстве по локализации Gentoo

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

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

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

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

Настройка локали
Есть одна переменная среды, которую необходимо установить, чтобы использовать UTF-8 локали:  (или, опционально, переменную , если вы хотите заодно изменить и системный язык). Есть множество способов сделать это. Некоторые люди предпочитают использовать UTF-8 только для определенного пользователя, поэтому они устанавливают эту переменную в своём (если используется  ),  или  (если используется  ). Большее количество информации, а также наилучшие способы локализации можно найти в нашем Гайде по Локализации.

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

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

Далее следует обновить среду.

Теперь запустите  без аргументов, чтобы увидеть, что у вас верные переменные среды:

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

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

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

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

Не устанавливайте  в UTF-8, так как это не рекомендуется. Вместо этого укажите параметр utf8=true при монтировании раздела FAT. Для более детальной информации, смотрите  и документацию по ядру.

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

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

Замените koi8-r кодировкой, с которой хотите конвертировать:

Для изменения содержимого файлов, используйте утилиту, поставляемую вместе с. Замените koi8-r кодировкой, с которой хотите конвертировать, и проверьте вывод программы:

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

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

Системная консоль
Для включения UTF-8 в консоли вы должны отредактировать и установить переменную. Также прочтите комментарии в этом файле - важно, чтобы в системе были шрифты с нужным диапазоном символов, если вы хотите выжать из Юникода всё. Чтобы это сработало, удостоверьтесь, что вы правильно создали локаль Unicode.

В файле переменной   должна соответствовать раскладка Unicode.

Ncurses и Slang
Будет хорошим решением добавить  к глобальным USE-флагам в файле, а затем при необходимости пересобрать   и. Portage это сделает автоматически при обновлении системы:

Также понадобится пересобрать пакеты, зависящие от них, раз изменения USE	вступили в силу. Используемая утилита входит в пакет.

KDE, GNOME и 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, имеют великолепную поддержку кодировок, хотя не все глифы Юникода могут быть отображены для конкретного шрифта. Чтобы собрать шрифты с поддержкой Восточноазиатских алфавитов (включающие набор Bitstream Vera) для X-сервера, добавьте USE-флаг. Много приложений используют этот флаг, поэтому неплохо бы внести его как постоянный флаг.

Также несколько пакетов шрифтов в Portage совместимы с Юникодом.

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

Эмуляторы терминала, использующие Xft и поддерживающие Юникод найти сложнее. Кроме Konsole и gnome-terminal, лучшим выбором в Portage будет,  ,  ,   или чистый  , собранный с USE-флагом   и запускаемый как. тоже поддерживает UTF-8, если запускается с параметром, или в файле  есть следующая строчка:

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

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

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

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

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

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

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

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

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

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

man.conf changes for Unicode support

elinks and links
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 Enter. Then Save and exit the menu. On  you may have to do a repeat   and then press   to save. The config file option, is shown below.

Enabling UTF-8 for elinks/links

Samba
Samba is a software suite which implements the SMB (Server Message Block) protocol for UNIX systems such as Macs, Linux and FreeBSD. The protocol is also sometimes referred to as the Common Internet File System (CIFS). Samba also includes the NetBIOS system - used for file sharing over windows networks.

add the following under the [global] section:

Testing it all out
There are numerous UTF-8 test websites around. , ,   ,   and all Mozilla based browsers (including Firefox) support UTF-8. Konqueror and Opera have full UTF-8 support too.

When using one of the text-only web browsers, make absolutely sure you are using a Unicode-aware terminal.

If you see certain characters displayed as boxes with letters or numbers inside, this means that your font does not have a character for the symbol or glyph that the UTF-8 wants. Instead, it displays a box with the hex code of the UTF-8 symbol.


 * A W3C UTF-8 Test Page
 * A UTF-8 test page provided by the University of Frankfurt

Input Methods
Dead keys may be used to input characters in X that are not included on your keyboard. These work by pressing your right Alt key (or in some countries, AltGr) and an optional key from the non-alphabetical section of the keyboard to the left of the return key at once, releasing them, and then pressing a letter. The dead key should modify it. Input can be further modified by using the Shift key at the same time as pressing the AltGr and modifier.

To enable dead keys in X, you need a layout that supports it. Most European layouts already have dead keys with the default variant. However, this is not true of North American layouts. Although there is a degree of inconsistency between layouts, the easiest solution seems to be to use a layout in the form "en_US" rather than "us", for example. The layout is set in like so:

/etc/X11/xorg.conf snippet

This change will come into effect when your X server is restarted. To apply the change now, use the  tool, for example,.

It is probably easiest to describe dead keys with examples. Although the results are locale dependent, the concepts should remain the same regardless of locale. The examples contain UTF-8, so to view them you need to either tell your browser to view the page as UTF-8, or have a UTF-8 locale already configured.

When I press AltGr and [ at once, release them, and then press a, 'ä' is produced. When I press AltGr and [ at once, and then press e, 'ë' is produced. When I press AltGr and ; at once, 'á' is produced, and when I press AltGr and ; at once, release them, and then press e, 'é' is produced.

By pressing AltGr, Shift and [ at once, releasing them, and then pressing a, a Scandinavian 'å' is produced. Similarly, when I press AltGr, Shift and [ at once, release only the [, and then press it again, '°' is produced. Although it looks like one, this (U+02DA) is not the same as a degree symbol (U+00B0).

AltGr can be used with alphabetical keys alone. For example, AltGr and m, a Greek lower-case letter mu is produced. AltGr and s produce a scharfes s or esszet, etc. As many European users would expect (because it is marked on their keyboard), AltGr and 4 (or E depending on the keyboard layout) produces a Euro sign, '€'.

Resources

 * The Wikipedia entry for Unicode
 * The Wikipedia entry for UTF-8
 * Unicode.org
 * UTF-8.com
 * RFC 3629
 * RFC 2277
 * Characters vs. Bytes

System Configuration Files (in /etc)
Most system configuration files, such as, do not support UTF-8. It is recommended to stick with the ASCII character set for these files.

Acknowledgements
We would like to thank the following authors and editors for their contributions to this guide:


 * Thomas Martin
 * Alexander Simonov
 * Shyam Mani
 * nightmorph