UTF8
UTF-8 (от англ. Unicode Transformation Format — формат преобразования Юникода) — в настоящее время распространённая кодировка, реализующая представление Юникода, совместимое с 8-битным кодированием текста.
Текст, состоящий только из символов с номером меньше 128, при записи в UTF-8 превращается в обычный текст байт со значением меньше 128 изображает символ ASCII с тем же кодом. Остальные символы Юникода изображаются последовательностями длиной от 2 до 6 байтов (реально только до 4 байт, поскольку использование кодов больше 2 21 не планируется), в которых первый байт всегда имеет вид 11xxxxxx , а остальные — 10xxxxxx .
Проще говоря, в формате UTF-8 символы латинского алфавита, знаки препинания и управляющие символы ASCII записываются кодами US-ASCII, a все остальные символы кодируются при помощи нескольких октетов со старшим битом 1. Это приводит к двум эффектам.
- Даже если программа не распознаёт Юникод, то латинские буквы, арабские цифры и знаки препинания будут отображаться правильно.
- В случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимают существенный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с [1][2]
- На первый взгляд может показаться, что UTF-16 удобнее, так как в ней большинство символов кодируется ровно двумя байтами. Однако это сводится на нет необходимостью поддержки суррогатных пар, о которых часто забывают при использовании UTF-16, реализовывая лишь поддержку символов UCS-2. [1]
Формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9 [3] . Сейчас стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.
Символы UTF-8 получаются из Unicode следующим образом:
Unicode | UTF-8 |
---|---|
0x00000000 — 0x0000007F | 0xxxxxxx |
0x00000080 — 0x000007FF | 110xxxxx 10xxxxxx |
0x00000800 — 0x0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
0x00010000 — 0x001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
Также теоретически возможны, но не включены в стандарты:
Unicode | UTF-8 |
---|---|
0x00200000 — 0x03FFFFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
0x04000000 — 0x7FFFFFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
Замечание: Символы, закодированные в UTF-8, могут быть длиной до шести байтов, однако стандарт Unicode не определяет символов выше 0x10ffff , поэтому символы Unicode могут иметь максимальный размер в 4 байта в UTF-8.
Неиспользуемые значения байтов
В тексте UTF-8 принципиально не может быть байтов со значениями 254 (0xFE) и 255 (0xFF). Поскольку в Юникоде не определены символы с кодами выше 2 21 , то в UTF-8 оказываются неиспользуемыми также значения байтов от 248 до 253 (0xF8—0xFE). Если запрещены искусственно удлинённые (за счёт добавления ведущих нулей) последовательности UTF-8, то не используются также байтовые значения 192 и 193 (0xC0 и 0xC1).
Примечания
- ↑ 12Well, I’m BackString Theory (англ.) . Robert O’Callahan (2008-03-01). Проверено 1 марта 2008.
- ↑Ростислав ЧебыкинВсем кодировкам кодировка. UTF‑8: современно, грамотно, удобно.. HTML и CSS. Проверено 22 марта 2009.
- ↑http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt (англ.)
Ссылки
См. также
- Юникод в GNU/Linux
- Юникод в FreeBSD
- Plan 9
UTF-8 — что это и зачем нужна кодировка символов
Машины и люди говорят «на разных языках», однако пользователи видят на экране компьютера понятный им текст, даже если в памяти устройства он хранится в виде чисел. При создании веб-сайта разработчику необходимо помнить, что возможность его использовать должна быть не только у сервера, но и у конечного пользователя. Для преобразования числового представления информации в ее символьный вид используют кодировки. Долгое время разработчики использовали разные схемы для трансформации текста, и если на другом устройстве работала иная кодировка, часть информации не могла быть распознана и терялась. Ситуация исправилась с появлением Юникода. В нашем материале отвечаем на вопросы: UTF-8 — что это? Для чего служит? Какие преимущества и недостатки имеет стандарт?
Что такое UTF-8
UTF-8 (Unicode Transformation Format, 8-bit) — это система кодирования, работающая по стандарту Unicode. В библиотеке Юникода хранится более миллиона символов. Каждому из них присваивается уникальный код — кодовая точка. Например, для «!» кодовой точкой будет U+0021. UTF-8 преобразовывает символы Unicode в компьютерный текст — двоичные строки. Кроме того, кодировка работает и в обратную сторону: от двоичных строк к символам.
UTF-8 входит в семейство кодировок Unicode, каждая из которых уникальна. Особенность UTF-8 заключается в том, что она представляет символы в однобайтовых единицах. Один байт содержит в самом простом виде восемь бит информации, что нашло отражение в названии кодировки.
Для чего нужна кодировка символов
Компьютеры обрабатывают информацию в двоичной системе. Чтобы разобраться в текстовом сообщении, им необходимо обработать последовательность нулей и единиц. Например, английская литера А — это 01000001. Человеку для понимания текста этого недостаточно, он воспринимает данные, записанные с помощью букв, цифр и других символов, кроме того ему потребуется знание языка, на котором написано сообщение. Чтобы текст, передаваемый компьютером, стал доступен для пользователя, необходимо преобразовать его числовое представление в символьное. Инструментом для трансформации являются кодировки, которые содержат набор правил по преобразованию одного способа представления информации в другой.
Компьютер говорит на языке битов и байтов. Информация в двоичной системе измеряется с помощью битов. Если объем данных достигает 8 битов, то для удобства подсчетов используют большую единицу измерения — байт, далее следуют килобайты, мега- и гигабайты. Каждый символ текста записывается в компьютерной системе в виде строки битов.
Человек говорит на языке символов. Одним из первых наиболее универсальных стандартов кодирования является ASCII. Он имеет библиотеки, в которых систематизированы элементы двух языков — байтового и символьного. Буквам, знакам пунктуации, цифрам присваиваются индивидуальные числовые коды. Например, литере «B» в верхнем регистре по стандарту кодирования ASCII присваивается код «066». Затем данное обозначение соотносится с двоичной системой: «066» — это 01000010 при записи в нулях и единицах. В результате каждому идентификатору принадлежит свой символ и его байтовый аналог.
Стандарт ASCII содержит данные о самых востребованных символах и работает для передачи текста, написанного латинскими буквами. Однако пользователи веб-ресурсов, приложений, программного обеспечения и других ИТ-продуктов рассредоточены по всему миру. Поэтому для кодирования всех языков человечества и вообще любого символа, который когда-либо использовался, включая эмотиконы, появился стандарт с более широкими возможностями по хранению символов и соответствующих им кодов — Unicode. Его понимают большинство компьютеров на планете и носители основных мировых языков. Юникод хранит результаты преобразования информации, выполненного через систему кодирования UTF-8, UTF-16 или UTF-32.
Преимущества и недостатки
Юникод — это набор символов, взятых из всех языков мира, глифов и эмодзи. Семейство кодировок UTF определяет, как символ будет представлен в двоичной системе. UTF-8 позволяет пользователям работать в совместимой со всеобщими стандартами и принятой по всему миру многоязычной среде.
Языки программирования (ЯП) по-разному поддерживают и используют кодировки. Иногда они могут искажать Unicode. Недостатки Юникода для разных ЯП и программ:
- PHP. Данный язык программирования поддерживает 256 символов, то есть воспринимает 1 символ в строке за 1 байт информации. Так происходит, даже если символ в строке весит больше одного байта. Например, смайл может весить четыре байта, а для PHP все равно один. Однако это можно исправить, настроив многобайтовые функции. Тогда при подсчете длины строки PHP будет обращаться к памяти, а не считать символ за байт.
- JavaScript. Работает с кодировкой UTF-16. Сложные символы требуют две кодовых точки для ссылки.
- MySQL. Система управления базами данных не поддерживает UTF-8 в его стандартном виде. MySQL недостаточно 24 битов, чтобы представить один символ. СУБД поддерживает расширенную версию кодировки — UTF-8mb4.
Максимальный потенциал
С помощью UTF-8 можно записать код любой длины. Однако, для того чтобы работа алгоритма была эффективной и надежной, лучше ограничить размер кода. Unicode 6.х является действующим стандартом и предполагает использование кода до четырех байт в UTF-8.
Сравнение UTF-8 и UTF-16
UTF-8 и UTF-16 — две самые широко используемые кодировки в стандарте Unicode. Они обе обладают переменной длинной кодирования. Один символ в них может быть представлен разным количеством байт. В Юникоде все данные хранятся в таблице и отсортированы по количеству байт, которое они имеют в двоичной системе. В начале стандарта символы могут занимать всего 1 байт, поэтому и UTF-8 зашифрует их с помощью 1 байта. Если данные требуют двух байтов, то и в UTF-8 они будут весить два байта. UTF-8 кодирует символ в двоичную строку от одного до четырех байтов. Так, для шифрования латинских символов достаточно одного байта, а для кириллических — двух. Для данных языков максимального потенциала UTF-8 достаточно.
UTF-16 оперирует данными из двух и четырех байт. Кодировка подходит для восточных языков.
Заключение
UTF-8 является самым распространенным методом кодирования в Сети, поскольку позволяет хранить текст, содержащий любой символ. Он способен перевести символы, содержащиеся в библиотеке Юникода, в байты, а затем выполнить обратный процесс.
UTF-8
UTF-8 — это кодировка символов переменной длины, что, в данном случае, означает длину от 1 до 4 байт на символ. Первый байт UTF-8 используется для кодирования ASCII, что означает, что данный набор символов полностью обратно совместим с ASCII. UTF-8 означает, что символы ASCII и Latin полностью взаимозаменяемы с небольшим увеличением размера данных, так как используется только первый байт. Пользователи восточных алфавитов, например, японского, которым назначили диапазон с большим числом байт несчастливы, так как это приводит к 50-процентной избыточности в их данных.
- 1 Кодировки символов
- 1.1 Что такое кодировка символов?
- 1.2 История кодировок символов
- 1.3 Что такое Юникод?
- 1.4 Что UTF-8 может сделать
- 2.1 Поиск или создание локалей UTF-8
- 2.2 Настройка локали
- 2.3 Альтернатива: Использование eselect для настройки локали
- 3.1 (V)FAT
- 3.2 Имена файлов
- 3.3 Системная консоль
- 3.4 Ncurses и Slang
- 3.5 KDE, GNOME и Xfce
- 3.6 X11 и шрифты
- 3.7 Диспетчеры окон и эмуляторы терминалов
- 3.8 Vim, emacs, xemacs и nano
- 3.9 Командные оболочки
- 3.10 Irssi
- 3.11 Mutt
- 3.12 links и elinks
- 3.13 Samba
- 3.14 Проверка работоспособности
- 4.1 Системные конфигурационные файлы (в /etc)
Кодировки символов
Что такое кодировка символов?
Компьютеры неспособны воспринимать текст как человек. Вместо этого они каждый символ представляют как число. Традиционно каждый набор чисел, используемый для представления алфавитов и символов (известный как кодировка или набор символов), ограничен по размеру в силу ограничений оборудования.
История кодировок символов
Самой распространенной (или, по крайней мере, наиболее принятой повсеместно) кодировкой является 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. Сюда входят 33 невидимых управляющих символа с кодами от 0 до 31 и управляющим символом DEL (или delete) с кодом 127. Символы в диапазоне от 32 до 126 видимы — это пробел, знаки препинания, латинские буквы и цифры.
Восьмой бит в ASCII изначально использовался как бит контроля четности для проверки ошибок при передаче информации. Если проверка на ошибки не важна, то он остается равным 0. Это означает, что в ASCII каждый символ занимал один байт.
Хотя ASCII было достаточно для передачи информации на английском, для других европейских языков, содержащих символы с диакритическими знаками, это было не так просто. Для них был разработаны стандарты семейства ISO 8859. Они были обратно совместимы с ASCII, но использовали восьмой бит для дополнения таблицы дополнительными 128 символами (32 управляющих и 96 видимых) для каждой кодировки. Скоро стали видны и ограничения ISO 8859. На данный момент существует 15 вариантов стандарта ISO 8859 (с 8859-1 по 8859-15). Зачастую для каждого символа вне ASCII-совместимого диапазона между этими стандартами возникал конфликт. И словно этого было мало, для ещё большей путаницы корпорация Microsoft ввела собственную кодировку Windows-1252, использовавшуюся для западноевропейских языков в некоторых версиях Microsoft 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
На выходе этой команды мы должны получить хотя бы одну строку, содержащую суффикс .UTF-8 . Если таковых нет, то нам придётся создать локаль, совместимую с UTF-8.
Команда выше перечисляет суффикс в нижнем регистре без дефисов, glibc понимает обе формы суффикса, многие другие программы — нет. Наиболее распространённым примером является Xorg. Поэтому лучше всегда использовать UTF-8 вместо utf8.
Заметка
Запускайте следующую команду, если в система не имеет 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.UTF-8
## (Как обычно, замените "en_GB.UTF-8" соответствующее значение локали; каждый язык имеет своё значение!) LANG="en_GB.UTF-8"
Заметка
Можно использовать 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=
Значения переменных окружения локали, которые были явно установлены, например, при помощи «export» (в bash), перечислены без двойных кавычек. Те переменные, чьи значения были унаследованы от других переменных окружения локали, содержат свои значения в двойных кавычках.
Альтернатива: Использование 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 как надо. К счастью, большинство распространенных программ поддерживают Юникод.
(V)FAT
Для настройки поддержки UTF-8 в файловых системах FAT смотрите статью FAT.
Имена файлов
Чтобы сменить кодировку имен файлов, используйте 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 —library libncurses.so.5
root # revdep-rebuild —library libslang.so.1KDE, GNOME и Xfce
Все основные графические оболочки полностью совместимы с Юникодом и не требуют дополнительной настройки, кроме той, что описана в этом документе. Все это благодаря тому, графические библиотеки (Qt и GTK+ 2) совместимы с UTF-8. Следовательно, все приложения, работающие на основе этих библиотек, также должны поддерживать UTF-8 без дополнительных настроек.
У приложений написанных на GTK+, для ввода шестнадцатеричного Юникода нужно ввести Ctrl + Shift + u + . Например, символ Юникода ✔ , у которого Юникод номер U+2714, может быть введен как Ctrl + Shift + u + 2714 + ENTER , что после преобразования станет ✔ .
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 поддерживает 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.
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.
- unicode-table.com
- тестовая страница UTF-8 W3C
- тестовая страничка UTF-8 от Университета Франкфурта
Известные проблемы
Системные конфигурационные файлы (в /etc)
Большинство системных конфигурационных файлов (например, /etc/fstab ) не поддерживают UTF-8. Рекомендуется придерживаться набора символов ASCII при работе с этими файлами.
Внешние ресурсы
- статья в Википедии про Юникод (ru)
- статья в Википедии про UTF-8 (ru)
- Unicode.org
- UTF-8.com
- RFC 3629
- RFC 2277
- символы и байты
- библиотека GNU C: локали и интернационализация
- unifoundry.com — руководство по unicode
- Описание USE-флага unicodeThis page is based on a document formerly found on our main website gentoo.org.
The following people contributed to the original document: Thomas Martin, Alexander Simonov, Shyam Mani,
They are listed here because wiki history does not allow for any external attribution. If you edit the wiki article, please do not add yourself here; your contributions are recorded on each article’s associated history page.
Что такое кодировка UTF-8? Руководство для непрограммистов
Текст: его важность в Интернете само собой разумеется. Это первая буква «Т» в «HTTP», единственная буква «Т» в «HTML», и практически каждый веб-сайт каким-то образом использует ее, будь то URL-адрес, рекламный текст, обзор продукта, вирусный твит или Сообщение блога. (Всем привет!)
Но веб-текст на самом деле может быть не таким простым, как вы думаете. Рассмотрим тысячи языков, на которых сегодня говорят, или все знаки препинания и символы, которые мы можем добавить, чтобы улучшить их, или тот факт, что создаются новые смайлики, чтобы уловить каждую человеческую эмоцию. Как веб-сайты все это хранят и обрабатывают?
По правде говоря, даже такая простая вещь, как текст, требует хорошо скоординированной, четко определенной системы для отображения в веб-браузерах. В этом посте я объясню основы одной технологии, которая имеет ключевое значение для текста в Интернете, UTF-8. Мы изучим основы хранения и кодирования текста и обсудим, как это помогает размещать привлекательные слова на вашем сайте.
Прежде чем мы начнем, вы должны быть знакомы с основами HTML и готовы погрузиться в легкую информатику.
Что такое UTF-8?
UTF-8 означает «Формат преобразования Unicode – 8 бит». Это пока не помогает нам, поэтому давайте вернемся к основам.
Двоичный: как компьютеры хранят информацию
Для хранения информации компьютеры используют двоичную систему. В двоичном формате все данные представлены в виде последовательностей единиц и нулей. Самая основная единица двоичного кода – это бит, который представляет собой всего лишь 1 или 0. Следующая по величине единица двоичного кода, байт, состоит из 8 бит. Пример байта – «01101011».
Каждый цифровой актив, с которым вы когда-либо сталкивались – от программного обеспечения до мобильных приложений, от веб-сайтов до историй в Instagram – построен на этой системе байтов, которые связаны друг с другом таким образом, что это имеет смысл для компьютеров. Когда мы говорим о размерах файлов, мы имеем в виду количество байтов. Например, килобайт – это примерно тысяча байт, а гигабайт – примерно миллиард байтов.
Текст – это один из многих ресурсов, которые компьютеры хранят и обрабатывают. Текст состоит из отдельных символов, каждый из которых представлен в компьютерах строкой битов. Эти строки собираются в цифровые слова, предложения, абзацы, любовные романы и т.д.
ASCII: преобразование символов в двоичные
Американский стандартный код обмена информацией (ASCII) был ранней стандартизированной системой кодирования текста. Кодирование – это процесс преобразования символов человеческих языков в двоичные последовательности, которые могут обрабатывать компьютеры.
Библиотека ASCII включает все буквы в верхнем и нижнем регистре латинского алфавита (A, B, C…), каждую цифру от 0 до 9 и некоторые общие символы (например, /,! И?). Он присваивает каждому из этих символов уникальный трехзначный код и уникальный байт.
В таблице ниже показаны примеры символов ASCII с соответствующими кодами и байтами.
символ Код ASCII БАЙТ А 065 01000001 а 097 01100001 B 066 01000010 б 098 01100010 С УЧАСТИЕМ 090 01011010 с участием 122 01111010 0 048 00110000 9 057 00111001 ! 033 00100001 ? 063 00111111 Подобно тому, как символы объединяются в слова и предложения в языке, двоичный код делает это в текстовых файлах. Итак, фраза «Быстрая коричневая лисица перепрыгивает через ленивого пса». в двоичном формате ASCII будет:
01010100 01101000 01100101 00100000 01110001 01110101 01101001 01100011 01101011 00100000 01100010 01110010 01101111 01110111 01101110 00100000 01100110 01101111 01111000 00100000 01101010 01110101 01101101 01110000 01110011 00100000 01101111 01110110 01100101 01110010 00100000 01110100 01101000 01100101 00100000 01101100 01100001 01111010 01111001 00100000 01100100 01101111 01100111 00101110
Это мало что значит для нас, людей, но это хлеб с маслом для компьютера.
Количество символов, которые может представлять ASCII, ограничено количеством доступных уникальных байтов, поскольку каждый символ получает один байт. Если вы посчитаете, то обнаружите, что существует 256 различных способов группировки восьми единиц и нулей вместе. Это дает нам 256 различных байтов или 256 способов представления символа в ASCII. Когда в 1960 году был представлен ASCII, это было нормально, поскольку разработчикам требовалось всего 128 байт для представления всех необходимых им английских символов и символов.
Но по мере глобального распространения компьютерных технологий компьютерные системы начали хранить текст не только на английском, но и на других языках, многие из которых использовали символы, отличные от ASCII. Были созданы новые системы для сопоставления других языков с тем же набором из 256 уникальных байтов, но использование нескольких систем кодирования было неэффективным и запутанным. Разработчикам требовался лучший способ кодирования всех возможных символов с помощью одной системы.
Юникод: способ хранить каждый символ, когда-либо
Используйте Unicode, систему кодирования, которая решает проблему пространства ASCII. Как и ASCII, Unicode присваивает каждому символу уникальный код, называемый кодовой точкой. Однако более сложная система Unicode может генерировать более миллиона кодовых точек, чего более чем достаточно для учета каждого символа на любом языке.
Юникод теперь является универсальным стандартом для кодирования всех человеческих языков. И да, он даже включает смайлы.
Ниже приведены несколько примеров текстовых символов и соответствующих им кодовых точек. Каждая кодовая точка начинается с буквы «U» для «Unicode», за которой следует уникальная строка символов для представления символа.
символ Кодовая точка А U+0041 а U+0061 0 U+0030 9 U+0039 ! U+0021 ОСТРОВ U + 00D8 ڃ U+0683 Ch U + 0C9A U+2070E U+1F601 Если вы хотите узнать, как генерируются кодовые точки и что они означают в Unicode, ознакомьтесь с этим подробным объяснением.
Итак, теперь у нас есть стандартизированный способ представления каждого символа, используемого каждым человеческим языком, в единой библиотеке. Это решает проблему нескольких систем маркировки для разных языков – любой компьютер на Земле может использовать Unicode.
Но один только Unicode не хранит слова в двоичном формате. Компьютерам нужен способ перевода Unicode в двоичный код, чтобы его символы можно было хранить в текстовых файлах. Вот где пригодится UTF-8.
UTF-8: последний кусок головоломки
UTF-8 – это система кодирования Unicode. Он может преобразовывать любой символ Юникода в соответствующую уникальную двоичную строку, а также может преобразовывать двоичную строку обратно в символ Юникода. Это значение «UTF» или «Формат преобразования Unicode».
Помимо UTF-8, существуют и другие системы кодирования Unicode, но UTF-8 уникален, поскольку представляет символы в однобайтовых единицах. Помните, что один байт состоит из восьми бит, отсюда и «-8» в его названии.
Более конкретно, UTF-8 преобразует кодовую точку (которая представляет один символ в Unicode) в набор от одного до четырех байтов. Первые 256 символов в библиотеке Unicode, включая символы, которые мы видели в ASCII, представлены как один байт. Символы, которые появляются позже в библиотеке Unicode, кодируются как двухбайтовые, трехбайтовые и, возможно, четырехбайтовые двоичные единицы.
Ниже приведена та же таблица символов, что и выше, с выводом UTF-8 для каждого добавленного символа. Обратите внимание, что некоторые символы представлены одним байтом, а другие используют больше.
символ Кодовая точка Двоичная кодировка UTF-8 А U+0041 01000001 а U+0061 01100001 0 U+0030 00110000 9 U+0039 00111001 ! U+0021 00100001 ОСТРОВ U + 00D8 11000011 10011000 ڃ U+0683 11011010 10000011 Ch U + 0C9A 11100000 10110010 10011010 U+2070E 11110000 10100000 10011100 10001110 U+1F601 11110000 10011111 10011000 10000001 Почему UTF-8 преобразовывает одни символы в один байт, а другие – в четыре байта? Короче для экономии памяти. Используя меньше места для представления более общих символов (например, символов ASCII), UTF-8 уменьшает размер файла, позволяя использовать гораздо большее количество менее распространенных символов. Эти менее распространенные символы кодируются в два или более байта, но это нормально, если они хранятся экономно.
Пространственная эффективность – ключевое преимущество кодировки UTF-8. Если бы вместо этого каждый символ Unicode был представлен четырьмя байтами, текстовый файл, написанный на английском языке, был бы в четыре раза больше, чем тот же файл, закодированный с помощью UTF-8.
Еще одно преимущество кодировки UTF-8 – обратная совместимость с ASCII. Первые 128 символов в библиотеке Unicode соответствуют символам в библиотеке ASCII, и UTF-8 переводит эти 128 символов Unicode в те же двоичные строки, что и ASCII. В результате UTF-8 может без проблем преобразовывать текстовый файл, отформатированный в ASCII, в читаемый человеком текст.
Символы UTF-8 в веб-разработке
UTF-8 – наиболее распространенный метод кодирования символов, используемый сегодня в Интернете, и набор символов по умолчанию для HTML5. Таким образом хранятся персонажи более 95% всех веб-сайтов, в том числе и ваш собственный. Кроме того, распространенные методы передачи данных через Интернет, такие как XML и JSON, кодируются стандартами UTF-8.
Поскольку теперь это стандартный метод кодирования текста в Интернете, все страницы вашего сайта и базы данных должны использовать UTF-8. Система управления контентом или конструктор веб-сайтов по умолчанию сохранят ваши файлы в формате UTF-8, но все же рекомендуется убедиться, что вы придерживаетесь этой передовой практики.
Текстовые файлы, закодированные с помощью UTF-8, должны указывать на это программному обеспечению, обрабатывающему их. В противном случае программа не сможет должным образом преобразовать двоичный код обратно в символы. В файлах HTML вы можете увидеть строку кода, подобную следующей, вверху:
Это сообщает браузеру, что файл HTML закодирован в UTF-8, чтобы браузер мог преобразовать его обратно в разборчивый текст.
UTF-8 против UTF-16
Как я уже упоминал, UTF-8 – не единственный метод кодирования символов Unicode – существует также UTF-16. Эти методы различаются количеством байтов, необходимых для хранения символа. UTF-8 кодирует символ в двоичную строку из одного, двух, трех или четырех байтов. UTF-16 кодирует символ Unicode в строку из двух или четырех байтов.
Это различие видно из их названий. В UTF-8 наименьшее двоичное представление символа составляет один байт или восемь битов. В UTF-16 наименьшее двоичное представление символа составляет два байта или шестнадцать бит.
И UTF-8, и UTF-16 могут переводить символы Unicode в двоичные файлы, удобные для компьютера, и обратно. Однако они несовместимы друг с другом. Эти системы используют разные алгоритмы для сопоставления кодовых точек с двоичными строками, поэтому двоичный вывод для любого заданного символа будет отличаться от обоих методов:
символ Двоичная кодировка UTF-8 Двоичная кодировка UTF-16 А 01000001 01000001 11011000 00001110 11011111 11110000 10100000 10011100 10001110 01000001 11011000 00001110 11011111 Кодировка UTF-8 предпочтительнее UTF-16 на большинстве веб-сайтов, потому что она использует меньше памяти. Напомним, что UTF-8 кодирует каждый символ ASCII всего одним байтом. UTF-16 должен кодировать эти же символы в двух или четырех байтах. Это означает, что текстовый файл на английском языке с кодировкой UTF-16 будет как минимум вдвое больше размера того же файла с кодировкой UTF-8.
UTF-16 более эффективен, чем UTF-8, только на некоторых неанглоязычных сайтах. Если веб-сайт использует язык с символами, находящимися дальше в библиотеке Unicode, UTF-8 будет кодировать все символы как четыре байта, тогда как UTF-16 может кодировать многие из тех же символов только как два байта. Тем не менее, если ваши страницы заполнены буквами ABC и 123, придерживайтесь UTF-8.
Расшифровка мира кодировки UTF-8
Это было много слов о словах, поэтому давайте резюмируем то, что мы рассмотрели:
- Компьютеры хранят данные, включая текстовые символы, как двоичные (единицы и нули).
- ASCII был ранним способом кодирования или отображения символов в двоичный код, чтобы компьютеры могли их хранить. Однако в ASCII не было достаточно места для представления нелатинских символов и чисел в двоичном формате.
- Юникод был решением этой проблемы. Юникод присваивает уникальный «код» каждому символу на каждом человеческом языке.
- UTF-8 – это метод кодировки символов Unicode. Это означает, что UTF-8 берет кодовую точку для данного символа Юникода и переводит ее в строку двоичного кода. Он также делает обратное, считывая двоичные цифры и преобразуя их обратно в символы.
- UTF-8 в настоящее время является самым популярным методом кодирования в Интернете, поскольку он может эффективно хранить текст, содержащий любой символ.
- UTF-16 – еще один метод кодирования, но он менее эффективен для хранения текстовых файлов (за исключением тех, которые написаны на некоторых неанглийских языках).
Перевод Unicode – это не то, о чем большинству из нас нужно думать при просмотре или разработке веб-сайтов, и именно в этом суть – создать бесшовную систему обработки текста, которая работает для всех языков и веб-браузеров. Если он работает хорошо, вы этого не заметите.
Но если вы обнаружите, что страницы вашего веб-сайта занимают чрезмерно много места или если ваш текст завален буквами and и, пора применить ваши новые знания о UTF-8.