Utf-8 vs utf-16. несколько советов программистам
Содержание:
- Проблемы с кодировкой не только в HTML-странице
- Модуль ngx_http_charset_module
- keywords (ключевые слова)
- Htaccess
- Неправильная кодировка результатов из базы данных MySQL
- Range: Decimal 8448-8527. Hex 2100-214F.
- Кодировки на основе Unicode
- Принципы работы
- Важность кодировки
- Different types of charset
- Недостатки и достоинства
- Charset names
- Макет кодовой страницы
Проблемы с кодировкой не только в HTML-странице
Сайт, независимо от того является ли он просто набором статических HTML-документов или сложных динамических скриптов генерирующих страницы на лету, размещается на веб-сервере, который также работает с определенной кодировкой. И если сервер выдает информацию в одной кодировке, а ваши страницы или скрипты сохранены в другой кодировке, то опять же могут быть проблемы с отображением страниц в браузере пользователя. Многие хостинги позволяют менять настройки и выбрать кодировку в соответствии с той, которая используется в файлах сайта, через панель управления или же прописать ее в файле .htaccess, если на хостинге используется популярный веб-сервер Apache.
Практически ни один современный сайт не обходится без использования базы данных MySQL и она также может стать источником проблем с кодировкой. Если файлы сайта сохранены в одной кодировке, а информация в базе данных в другой, то на странице та часть информации, которая выводится из базы данных может отображаться в виде все тех же знаков вопросов или других непонятных символов. Чтобы избежать проблем с кодировкой она должна быть одинаковой для веб-сервера, базы данных MySQL, в скриптах, в HTML-страницах сайта и в META-теге, который прописывается в HTML-коде. Если есть проблемы с отображением текста, то проверяйте на наличие проблемы все выше перечисленное.
Модуль ngx_http_charset_module
Модуль добавляет указанную
кодировку в поле “Content-Type” заголовка ответа.
Кроме того, модуль может перекодировать данные из одной кодировки в другую
с некоторыми ограничениями:
- перекодирование осуществляется только в одну сторону — от сервера к клиенту,
- перекодироваться могут только однобайтные кодировки
- или однобайтные кодировки в UTF-8 и обратно.
Синтаксис: | |
---|---|
Умолчание: |
charset off; |
Контекст: | , , , |
Добавляет указанную кодировку в поле “Content-Type”
заголовка ответа.
Если эта кодировка отличается от указанной в директиве
, то выполняется перекодирование.
Параметр отменяет добавление кодировки
в поле “Content-Type” заголовка ответа.
Кодировка может быть задана с помощью переменной:
В этом случае необходимо, чтобы все возможные значения переменной
присутствовали хотя бы один раз в любом месте конфигурации в виде
директив , или
.
Для кодировок ,
и для этого достаточно включить в конфигурацию
файлы , и
.
Для других кодировок можно просто сделать фиктивную таблицу перекодировки,
например:
Кроме того, кодировка может быть задана в поле “X-Accel-Charset”
заголовка ответа.
Эту возможность можно запретить с помощью директив
,
,
,
и
.
Синтаксис: | |
---|---|
Умолчание: |
— |
Контекст: |
Описывает таблицу перекодирования из одной кодировки в другую.
Таблица для обратного перекодирования строится на основании тех же данных.
Коды символов задаются в шестнадцатеричном виде.
Неописанные символы в пределах 80-FF заменяются на “”.
При перекодировании из UTF-8 символы, отсутствующие в однобайтной кодировке,
заменяются на “”.
Пример:
При описании таблицы перекодирования в UTF-8, коды кодировки UTF-8 должны
быть указаны во второй колонке, например:
Полные таблицы преобразования из в
и из и
в
входят в дистрибутив и находятся в файлах ,
и .
Синтаксис: | |
---|---|
Умолчание: |
charset_types text/html text/xml text/plain text/vnd.wap.wml application/javascript application/rss+xml; |
Контекст: | , , |
Эта директива появилась в версии 0.7.9.
Разрешает работу модуля в ответах с указанными MIME-типами
в дополнение к “”.
Специальное значение “” соответствует любому MIME-типу
(0.8.29).
Синтаксис: | |
---|---|
Умолчание: |
override_charset off; |
Контекст: | , , , |
Определяет, выполнять ли перекодирование для ответов,
полученных от проксированного сервера или от FastCGI/uwsgi/SCGI/gRPC-сервера,
если в ответах уже указана кодировка в поле “Content-Type”
заголовка ответа.
Если перекодирование разрешено, то в качестве исходной кодировки
используется кодировка, указанная в полученном ответе.
Синтаксис: | |
---|---|
Умолчание: |
— |
Контекст: | , , , |
Задаёт исходную кодировку ответа.
Если эта кодировка отличается от указанной в директиве
, то выполняется перекодирование.
keywords (ключевые слова)
У любого сайта есть набор ключевых слов и словосочетаний, по которым поисковые системы ищут нужные ресурсы в сети. Именно эти слова и должны составлять содержимое keywords.
Самый простой способ подобрать нужные ключевые слова для текущей страницы — это определить по каким словам вы сами стали бы искать материал, представленный на ней? Вот это и будут нужные ключевые слова. Пример:
<meta name="keywords" content="мета тег, meta, метаданные, keywords, description">
Ключевые слова указываются через запятую или пробел и могут быть написаны в любом регистре. Рекомендуется указывать не более 10-15 ключевых слов или словосочетаний.
В настоящее время поисковые системы стали более продвинутые и определяют категорию, к которой относится информация, по содержимому веб-страницы, а ключевые слова отошли на второй план или полностью игнорируются.
Htaccess
Если на сайте вы настойчиво решили использовать именно 1251, то вам следует найти или создать файл htaccess. Он отвечает за настройки конфигурации. В него придется добавить еще три строчки, чтобы все сошлось.
DefaultLanguage ru; AddDefaultCharset windows-1251; php_value default_charset "cp1251" |
Я все же настоятельно рекомендую вам задумать о использовании UTF-8. Он более популярен, прост и богат
Какие бы решения вы не приняли сейчас, важно, чтобы впоследствии можно было все исправить. Добавить англоязычную версию сайта на этой кодировке будет в разы проще
Ничего не нужно исправлять.
Решение остается за вами. Подписывайтесь на рассылку, чтобы узнавать как можно быстрее создавать правильные сайты, где учиться, чтобы не повторять чужих ошибок, а также какие блоггеры получают больше посетителей.
До новых встреч и удачи в ваших начинаниях.
Неправильная кодировка результатов из базы данных MySQL
Если ваш сайт состоит из статической части (шаблон) и динамической, которая формируется из данных, получаемых из базы данных, то может возникнуть ситуация, когда часть сайта имеет правильную кодировку, а другая часть сайта имеет неправильную. В этом случае бесполезно менять настройки веб-сервера – поскольку всё равно часть страницы будет иметь неправильную кодировку.
Нужно начать с определения кодировки ваших таблиц. Можно посмотреть в phpMyAdmin:
Обратите внимание на столбец «Сравнение», запись «utf8_unicode_ci» означает, что используется кодировка UTF-8.
Можно подключиться к СУБД MySQL и проверить кодировку таблиц без phpMyAdmin. Для этого:
mysql -u root -p
Если вы забыли имя базы данных, то выполните команду:
SHOW DATABASES;
Предположим, я хочу посмотреть кодировку для таблиц в базе данных information_schema
USE information_schema;
Если вы забыли имя таблиц, выполните:
SHOW TABLES;
Далее выполните команду, в которой имя_таблицы замените на настоящее имя таблицы:
SHOW FULL COLUMNS FROM имя_таблицы;
Например:
SHOW FULL COLUMNS FROM GLOBAL_STATUS;
Вы увидите примерно следующее:
Смотрите столбец Collation. В моём случае там utf8_general_ci, это, как и utf8_unicode_ci, кодировка UTF-8. Кстати, если вы не знаете в чём разница между кодировками utf8_general_ci, utf8_unicode_ci, utf8mb4_general_ci, utf8mb4_unicode_ci, а также какую кодировку выбрать для базы данных MySQL, то посмотрите эту статью.
Теперь, когда мы узнали кодировку (в моём случае это UTF-8), то при каждом подключении к СУБД MySQL нужно выполнять последовательно запросы:
SET NAMES UTF8 SET CHARACTER SET UTF8 SET character_set_client = UTF8 SET character_set_connection = UTF8 SET character_set_results = UTF8
В PHP это можно сделать примерно так:
$this->mysqli = new mysqli($server, $username, $password, $basename); if ($this->mysqli->connect_error) { $this->errorHandler_c->logError(1, 'Connect Error (' . $this->mysqli->connect_errno . ') ' . $this->mysqli->connect_error, $_SERVER ); } $this->mysqli->query("SET NAMES UTF8"); $this->mysqli->query("SET CHARACTER SET UTF8"); $this->mysqli->query("SET character_set_client = UTF8"); $this->mysqli->query("SET character_set_connection = UTF8"); $this->mysqli->query("SET character_set_results = UTF8");
Обратите внимание, что UTF8 вам нужно заменить на ту кодировку, которая используется для ваших таблиц.
Range: Decimal 8448-8527. Hex 2100-214F.
If you want any of these characters displayed in HTML, you can use the HTML
entity found in the table below.
If the character does not have an HTML entity, you can use the decimal (dec)
or hexadecimal (hex) reference.
Will display as:
I will display
I will display
I will display
Older browsers may not support all the HTML5 entities in the table below.
Chrome and Opera have good support, and IE 11+ and Firefox 35+ support all the entities.
Char | Dec | Hex | Entity | Name |
---|---|---|---|---|
℀ | 8448 | 2100 | ACCOUNT OF | |
℁ | 8449 | 2101 | ADDRESSED TO THE SUBJECT | |
ℂ | 8450 | 2102 | DOUBLE-STRUCK CAPITAL C | |
℃ | 8451 | 2103 | DEGREE CELSIUS | |
℄ | 8452 | 2104 | CENTRE LINE SYMBOL | |
℅ | 8453 | 2105 | CARE OF | |
℆ | 8454 | 2106 | CADA UNA | |
ℇ | 8455 | 2107 | EULER CONSTANT | |
℈ | 8456 | 2108 | SCRUPLE | |
℉ | 8457 | 2109 | DEGREE FAHRENHEIT | |
ℊ | 8458 | 210A | SCRIPT SMALL G | |
ℋ | 8459 | 210B | SCRIPT CAPITAL H | |
ℌ | 8460 | 210C | BLACK-LETTER CAPITAL H | |
ℍ | 8461 | 210D | DOUBLE-STRUCK CAPITAL H | |
ℎ | 8462 | 210E | PLANCK CONSTANT | |
ℏ | 8463 | 210F | PLANCK CONSTANT OVER TWO PI | |
ℐ | 8464 | 2110 | SCRIPT CAPITAL I | |
ℑ | 8465 | 2111 | ℑ | BLACK-LETTER CAPITAL I |
ℒ | 8466 | 2112 | SCRIPT CAPITAL L | |
ℓ | 8467 | 2113 | SCRIPT SMALL L | |
℔ | 8468 | 2114 | L B BAR SYMBOL | |
ℕ | 8469 | 2115 | DOUBLE-STRUCK CAPITAL N | |
№ | 8470 | 2116 | NUMERO SIGN | |
℗ | 8471 | 2117 | SOUND RECORDING COPYRIGHT | |
℘ | 8472 | 2118 | ℘ | SCRIPT CAPITAL P |
ℙ | 8473 | 2119 | DOUBLE-STRUCK CAPITAL P | |
ℚ | 8474 | 211A | DOUBLE-STRUCK CAPITAL Q | |
ℛ | 8475 | 211B | SCRIPT CAPITAL R | |
ℜ | 8476 | 211C | ℜ | BLACK-LETTER CAPITAL R |
ℝ | 8477 | 211D | DOUBLE-STRUCK CAPITAL R | |
℞ | 8478 | 211E | PRESCRIPTION TAKE | |
℟ | 8479 | 211F | RESPONSE | |
℠ | 8480 | 2120 | SERVICE MARK | |
℡ | 8481 | 2121 | TELEPHONE SIGN | |
8482 | 2122 | ™ | TRADE MARK SIGN | |
℣ | 8483 | 2123 | VERSICLE | |
ℤ | 8484 | 2124 | DOUBLE-STRUCK CAPITAL Z | |
℥ | 8485 | 2125 | OUNCE SIGN | |
Ω | 8486 | 2126 | Ω | OHM SIGN |
℧ | 8487 | 2127 | ℧ | INVERTED OHM SIGN |
ℨ | 8488 | 2128 | BLACK-LETTER CAPITAL Z | |
℩ | 8489 | 2129 | TURNED GREEK SMALL LETTER IOTA | |
K | 8490 | 212A | KELVIN SIGN | |
Å | 8491 | 212B | ANGSTROM SIGN | |
ℬ | 8492 | 212C | SCRIPT CAPITAL B | |
ℭ | 8493 | 212D | BLACK-LETTER CAPITAL C | |
℮ | 8494 | 212E | ESTIMATED SYMBOL | |
ℯ | 8495 | 212F | SCRIPT SMALL E | |
ℰ | 8496 | 2130 | SCRIPT CAPITAL E | |
ℱ | 8497 | 2131 | SCRIPT CAPITAL F | |
Ⅎ | 8498 | 2132 | TURNED CAPITAL F | |
ℳ | 8499 | 2133 | SCRIPT CAPITAL M | |
ℴ | 8500 | 2134 | SCRIPT SMALL O | |
ℵ | 8501 | 2135 | ℵ | ALEF SYMBOL |
ℶ | 8502 | 2136 | BET SYMBOL | |
ℷ | 8503 | 2137 | GIMEL SYMBOL | |
ℸ | 8504 | 2138 | DALET SYMBOL | |
8505 | 2139 | INFORMATION SOURCE | ||
℺ | 8506 | 213A | ROTATED CAPITAL Q | |
℻ | 8507 | 213B | FACSIMILE SIGN | |
ℼ | 8508 | 213C | DOUBLE-STRUCK SMALL PI | |
ℽ | 8509 | 213D | DOUBLE-STRUCK SMALL GAMMA | |
ℾ | 8510 | 213E | DOUBLE-STRUCK CAPITAL GAMMA | |
ℿ | 8511 | 213F | DOUBLE-STRUCK CAPITAL PI | |
⅀ | 8512 | 2140 | DOUBLE-STRUCK N-ARY SUMMATION | |
⅁ | 8513 | 2141 | TURNED SANS-SERIF CAPITAL G | |
⅂ | 8514 | 2142 | TURNED SANS-SERIF CAPITAL L | |
⅃ | 8515 | 2143 | REVERSED SANS-SERIF CAPITAL L | |
⅄ | 8516 | 2144 | TURNED SANS-SERIF CAPITAL Y | |
ⅅ | 8517 | 2145 | DOUBLE-STRUCK ITALIC CAPITAL D | |
ⅆ | 8518 | 2146 | DOUBLE-STRUCK ITALIC SMALL D | |
ⅇ | 8519 | 2147 | DOUBLE-STRUCK ITALIC SMALL E | |
ⅈ | 8520 | 2148 | DOUBLE-STRUCK ITALIC SMALL I | |
ⅉ | 8521 | 2149 | DOUBLE-STRUCK ITALIC SMALL J | |
⅊ | 8522 | 214A | PROPERTY LINE | |
⅋ | 8523 | 214B | TURNED AMPERSAND | |
⅌ | 8524 | 214C | PER SIGN | |
⅍ | 8525 | 214D | AKTIESELSKAB | |
ⅎ | 8526 | 214E | TURNED SMALL F | |
⅏ | 8527 | 214F | SYMBOL FOR SAMARITAN SOURCE |
❮ Previous
Next ❯
Кодировки на основе Unicode
Unicode можно себе представить как огромную таблицу символов. В памяти компьютера записываются не сами символы, а номера из таблицы. Записывать их можно разными способами. Именно для этого на основе Unicode разработаны несколько кодировок, которые отличаются способом записи номера символа Unicode в виде набора байт. Они называются UTF — Unicode Transformation Format. Есть кодировки постоянной длины, например, UTF-32, в которой номер любого символа из таблицы Unicode занимает ровно 4 байта. Однако наибольшую популярность получила UTF-8 — кодировка с переменным числом байт. Она позволяет кодировать символы так, что наиболее распространённые символы занимают 1-2 байта, и только редко встречающиеся символы могут использовать по 4 байта. Например, все символы таблицы ASCII занимают ровно по одному байту, поэтому текст, написанный на английском языке с использованием кодировки UTF-8, будет занимать столько же места, как и текст, написанный с использованием таблицы символов ASCII.
На сегодняшний день Unicode является основной кодировкой, которую используют в работе все, кто связан с компьютерами и текстами. Unicode позволяет использовать сотни тысяч различных символов и отображать их одинаково на всех устройствах от мобильных телефонов до компьютеров на космических станциях.
Принципы работы
UTF-8 является лишь представлением Unicode в 8-битном виде. Символы с кодами меньше 128 представляются одним байтом (Латинский алфавит, простейшие знаки препинания и арабские цифры), а так как в Unicode они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII.
Символы с кодами от:
- 128 — 2-мя байтами.(Кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит, сирийское письмо, некоторые знаки препинания).
- 2048 — 3-мя байтами (Все другие современные формы письменности, сложные знаки препинания; математические и другие специальные символы).
- 65536 — 4-мя байтами (Музыкальные символы, смайлы, редкие китайские иероглифы, вымершие формы письменности).
5 и 6 байтов не используется в Unicode.
Важность кодировки
Поскольку кодирование и декодирование входной строки зависит от формата, мы должны быть осторожны при этих операциях. Если мы используем неправильный формат, это приведет к неправильному выводу и может вызвать ошибки.
Первое декодирование неверно, так как оно пытается декодировать входную строку, которая закодирована в формате UTF-8. Второй правильный, поскольку форматы кодирования и декодирования совпадают.
a = 'This is a bit möre cömplex sentence.' print('Original string:', a) # Encoding in UTF-8 encoded_bytes = a.encode('utf-8', 'replace') # Trying to decode via ASCII, which is incorrect decoded_incorrect = encoded_bytes.decode('ascii', 'replace') decoded_correct = encoded_bytes.decode('utf-8', 'replace') print('Incorrectly Decoded string:', decoded_incorrect) print('Correctly Decoded string:', decoded_correct)
Вывод
Original string: This is a bit möre cömplex sentence. Incorrectly Decoded string: This is a bit m��re c��mplex sentence. Correctly Decoded string: This is a bit möre cömplex sentence.
Different types of charset
Most charsets came about from individual manufacturers catering to the needs of their clients. Most charsets are incompatible with each other (with a few exceptions). The three most common charsets are, ASCII (1968), ISO 8859-1 (1987) and UTF-8 (1996).
ASCII
Charset for the English language. Contains 7-bits that are mapped to 128 characters. Each letter is assigned a number from 0 to 127. This code set is quite restricted, but being one of the pioneers sparked the creation of a character set for each of the other languages. Most computers use ASCII codes to represent text.
Unicode
Unicode was created to unify 135 modern and historic languages under one standard. Unicode is a standard and not a charset itself. As of May 2019, version 12.1, Unicode contains 137,994 characters including symbols and emojis. The Unicode standard defines UTF-8, UTF-16, and UTF-32
UTF-8
Now the dominant code of the internet. UTF-8 is used in 94% of websites. It encodes the most common characters, basic numbers, and English with 8-bits. UTF-8 uses a minimum of 1 byte. UTF-8 is also identical to ASCII for English. This means that any ASCII text is also a UTF-8 text.
UTF-16
Unicode with 16 bits. While used originally with systems such as Windows and Java, it never really took off with Linux and macOS. Today UTF-16 is used with 0.01% of webpages. UTF-16 uses a minimum of 2 bytes.
Image Source
UTF-32
Unicode with 32 bits. The advantage of UTF-32 is that the Unicode points are directly indexed. The disadvantage is that it is not efficient with its use of space as it always uses 4 bytes. This means up to twice the size of UTF-16 and four times to that of UTF-8.
Недостатки и достоинства
UTF-8, в отличие от windows-1251 универсальная кодировка, в ней содержатся буквы различных алфавитов. Существует даже UTF-128, где есть вообще все языки – теулу, суахили, лаосский, мальтийский и так далее.
UTF-8 победнее, буквы занимают в разы меньше места и занимают всего один байт памяти, как и в 1251. В УТФ есть редкие символы из других языков или специальные символы. Они-то и весят по 5-6 байтов, но в документе используются крайне редко.
Эта кодировка более продумана, а потому ее использует большинство приложений по умолчанию. То есть, если вы не указываете программе, какую кодировку вы используете, то первым делом он проверит именно UTF-8 .
Когда вы создаете html документ для сайта, то указываете браузерам на какую таблицу им обращать внимание при расшифровке записей. Для этого необходимо вставить в тег head следующие данные
После символов «charset=» идет либо утф, либо виндовс, как в примере ниже
Для этого необходимо вставить в тег head следующие данные. После символов «charset=» идет либо утф, либо виндовс, как в примере ниже.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
Если в дальнейшем вы захотите что-то поменять и вставить фразу на албанском, используя эту таблицу расшифровок, то ничего не получится, ведь этого языка кодировка не поддерживает. UTF‑8 без проблем позволит вам это сделать.
Если вас заинтересовало правильное создание сайта, то я могу порекомендовать вам курс Михаила Русакова «Создание и Раскрутка сайта от А до Я».
Он содержит в себе очень много – 256 уроков, затрагивающих HTML, CSS, JavaScript, PHP, MySQL и XML. Помимо языков программирования вы сможете понять как монетизировать сайт, то есть скорее и больше получать прибыль. Один из немногих курсов, в котором было бы так подробно разъяснено все, что нужно.
Сам я вот уже год обучаюсь в школе блоггеров Александра Борисова. Это занимает в разы больше времени, конца и края пока не видно, но зато не менее исчерпывающе и дисциплинирует. Мотивирует продолжать разработку.
Ну а если возникают вопросы, не нужно искать по интернету. Всегда есть грамотный наставник.
Что-то я отошел от темы. Давайте вернемся к кодировкам.
Charset names
Charsets are named by strings composed of the following characters:
-
The uppercase letters 'A' through 'Z'
('\u0041' through '\u005a'), -
The lowercase letters 'a' through 'z'
('\u0061' through '\u007a'), -
The digits '0' through '9'
('\u0030' through '\u0039'), -
The dash character '-'
('\u002d', HYPHEN-MINUS), -
The plus character '+'
('\u002b', PLUS SIGN), -
The period character '.'
('\u002e', FULL STOP), -
The colon character ':'
('\u003a', COLON), and -
The underscore character '_'
('\u005f', LOW LINE).
RFC 2278: IANA Charset
Registration Procedures
Every charset has a canonical name and may also have one or more
aliases. The canonical name is returned by the method
of this class. Canonical names are, by convention, usually in upper case.
The aliases of a charset are returned by the
method.
Some charsets have an historical name that is defined for
compatibility with previous versions of the Java platform. A charset’s
historical name is either its canonical name or one of its aliases. The
historical name is returned by the getEncoding() methods of the
and classes.
If a charset listed in the IANA Charset
Registry is supported by an implementation of the Java platform then
its canonical name must be the name listed in the registry. Many charsets
are given more than one name in the registry, in which case the registry
identifies one of the names as MIME-preferred. If a charset has more
than one registry name then its canonical name must be the MIME-preferred
name and the other names in the registry must be valid aliases. If a
supported charset is not listed in the IANA registry then its canonical name
must begin with one of the strings "X-" or "x-".
The IANA charset registry does change over time, and so the canonical
name and the aliases of a particular charset may also change over time. To
ensure compatibility it is recommended that no alias ever be removed from a
charset, and that if the canonical name of a charset is changed then its
previous canonical name be made into an alias.
Макет кодовой страницы
В следующей таблице суммируется использование кодовых блоков UTF-8 (отдельных байтов или октетов) в формате кодовой страницы. Верхняя половина (от до ) предназначена для байтов, используемых только в однобайтных кодах, поэтому она выглядит как обычная кодовая страница; Нижняя половина — для байтов продолжения (от до ) и (возможно) ведущих байтов (от до ), и поясняется далее в легенде ниже.
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ | NUL0000 | SOH00011 | STX00022 | ETX00033 | EOT00044 | ENQ00055 | ACK00066 | BEL00077 | BS00088 | HT00099 | LF000A10 | VT000B11 | FF000C12 | CR000D13 | SO000E14 | SI000F15 |
1_ | DLE001016 | DC1001117 | DC2001218 | DC3001319 | DC4001420 | NAK001521 | SYN001622 | ETB001723 | CAN001824 | EM001925 | SUB001A26 | ESC001B27 | FS001C28 | GS001D29 | RS001E30 | US001F31 |
2_ | SP002032 | !002133 | «002234 | #002335 | $002436 | %002537 | &002638 | ‘002739 | (002840 | )002941 | *002A42 | +002B43 | ,002C44 | —002D45 | .002E46 | 002F47 |
3_ | 003048 | 003149 | 003250 | 003351 | 003452 | 003553 | 003654 | 003755 | 003856 | 003957 | 003A58 | ;003B59 | <003C60 | =003D61 | >003E62 | ?003F63 |
4_ | @004064 | A004165 | B004266 | C004367 | D004468 | E004569 | F004670 | G004771 | H004872 | I004973 | J004A74 | K004B75 | L004C76 | M004D77 | N004E78 | O004F79 |
5_ | P005080 | Q005181 | R005282 | S005383 | T005484 | U005585 | V005686 | W005787 | X005888 | Y005989 | Z005A90 | 005B91 | \005C92 | 005D93 | ^005E94 | _005F95 |
6_ | `006096 | a006197 | b006298 | c006399 | d0064100 | e0065101 | f0066102 | g0067103 | h0068104 | i0069105 | j006A106 | k006B107 | l006C108 | m006D109 | n006E110 | o006F111 |
7_ | p0070112 | q0071113 | r0072114 | s0073115 | t0074116 | u0075117 | v0076118 | w0077119 | x0078120 | y0079121 | z007A122 | {007B123 | |007C124 | }007D125 | ~007E126 | DEL007F127 |
8_ | •+00128 | •+01129 | •+02130 | •+03131 | •+04132 | •+05133 | •+06134 | •+07135 | •+08136 | •+09137 | •+0A138 | •+0B139 | •+0C140 | •+0D141 | •+0E142 | •+0F143 |
9_ | •+10144 | •+11145 | •+12146 | •+13147 | •+14148 | •+15149 | •+16150 | •+17151 | •+18152 | •+19153 | •+1A154 | •+1B155 | •+1C156 | •+1D157 | •+1E158 | •+1F159 |
A_ | •+20160 | •+21161 | •+22162 | •+23163 | •+24164 | •+25165 | •+26166 | •+27167 | •+28168 | •+29169 | •+2A170 | •+2B171 | •+2C172 | •+2D173 | •+2E174 | •+2F175 |
B_ | •+30176 | •+31177 | •+32178 | •+33179 | •+34180 | •+35181 | •+36182 | •+37183 | •+38184 | •+39185 | •+3A186 | •+3B187 | •+3C188 | •+3D189 | •+3E190 | •+3F191 |
2-byteC_ | 0000192 | 0040193 | Latin0080194 | Latin00C0195 | Latin0100196 | Latin0140197 | Latin0180198 | Latin01C0199 | Latin0200200 | IPA0240201 | IPA0280202 | IPA02C0203 | accents0300204 | accents0340205 | Greek0380206 | Greek03C0207 |
2-byteD_ | Cyril0400208 | Cyril0440209 | Cyril0480210 | Cyril04C0211 | Cyril0500212 | Armeni0540213 | Hebrew0580214 | Hebrew05C0215 | Arabic0600216 | Arabic0640217 | Arabic0680218 | Arabic06C0219 | Syriac0700220 | Arabic0740221 | Thaana0780222 | N’Ko07C0223 |
3-byteE_ | Indic0800*224 | Misc.1000225 | Symbol2000226 | Kana, CJK3000227 | CJK4000228 | CJK5000229 | CJK6000230 | CJK7000231 | CJK8000232 | CJK9000233 | AsianA000234 | HangulB000235 | HangulC000236 | HangulD000237 | PUAE000238 | FormsF000239 |
4‑byteF_ | SMP, SIP10000*240 | 40000241 | 80000242 | SSP, SPUAC0000243 | SPUA-B100000244 | 140000245 | 180000246 | 1C0000247 | 5-byte200000*248 | 5-byte1000000249 | 5-byte2000000250 | 5-byte3000000251 | 6-byte4000000*252 | 6-byte40000000253 | 254 | 255 |
Оранжевые ячейки с большой точкой являются байтами продолжения. Шестнадцатеричное число, указанное после знака «+», представляет собой значение шести бит, которые они добавляют.
Белые ячейки — это ведущие байты для последовательности из нескольких байтов, длина показана слева от строки. Текст показывает блоки Unicode, закодированные последовательностями, начинающимися с этого байта, а шестнадцатеричная кодовая точка, показанная в ячейке, является самым младшим символьным значением, закодированным с использованием этого старшего байта.
Красные клетки никогда не должны появляться в действительной последовательности UTF-8. Первые два (C0 и C1) могли использоваться только для недопустимого «чрезмерного кодирования» символов ASCII (то есть, пытаясь закодировать 7-битное значение ASCII между 0 и 127, используя два байта вместо одного, см. Ниже). Оставшиеся красные ячейки указывают ведущие байты последовательностей, которые могут только кодировать числа, превышающие предел 0x10FFFF в Юникоде, или которые также никогда не использовались в исходном проекте для 31 бита (FE и FF).
Розовые ячейки являются ведущими байтами для последовательности из нескольких байтов, из которых допустимы некоторые, но не все возможные последовательности продолжения. E0 и F0 могут начинать сглаженные кодировки, в этом случае отображается самая низкая незашифрованная кодовая точка, помеченная звездочкой «*». F4 может запускать кодовые точки более 0x10FFFF, которые являются недопустимыми. ED может начать кодирование суррогатной половины, которая не может быть закодирована в UTF-16 и также недействительна.