Универсальный декодер — конвертер кириллицы

Принципы Стандарта Юникод

  • Универсальность — каждую когда-либо используемую письменную систему следует уважать и представить в стандарте.
  • Логический порядок — в двунаправленном тексте символы хранятся в логическом порядке, а не в соответствии с представлением.
  • Эффективность — документация должна быть эффективной и полной.
  • Унификация — если разные культуры или языки используют один и тот же символ, он должен быть включен только один раз. Это ведёт к следующему пункту.
  • Символы, а не глифы — кодируются только символы, а не глифы. В двух словах, глифы являются фактической графической репрезентацией.
  • Динамическая композиция — новые символы могут быть составлены из других, уже стандартизированных символов. Например, символ может состоять из символа и символа диерезиса .
  • Семантика — включённые символы должны быть чётко определены и отличаться от других.
  • Стабильность — однажды определённые, символы никогда не будут удалены, а их кодовые точки никогда не будут переназначены. В случае ошибки кодовая точка считается устаревшей.
  • Обычный текст — символы в стандарте являются текстом, они никогда не могут быть разметкой или метасимволами.
  • Конвертируемость — любая другая используемая кодировка должна иметь возможность быть представленной в терминах кодировки Юникода.

ASCII

В определённый момент времени распространение получила кодировка ASCII (American Standard Code for Information Interchange). В ней определены 128 символов с кодами от 0 до 127. Сюда включён латинский алфавит, цифры и основные знаки препинания (   Основная латиница 0000–007F ), а также .

Практически все современные кодировки, использующиеся на персональных компьютерах являются ASCII-совместимыми. То есть первые 128 символов у них кодируются одинаково, а различия начинаются с кода 128 и выше. Вышеупомянутые Windows-1251 и KOI8-r также основаны на ASCII и если бы письмо начиналось бы с «Hello, my dear Maria!», то недопонимания не возникло бы.

Основан на ASCII и Юникод.


[править] Принцип кодирования

Текстовое описание

В UTF-8 можно кодировать значения кодов символов от 0 до 0x7FFFFFFF включительно (все комбинации 32-битных без установленного старшего бита).

  1. Каждый символ кодируется переменным количеством последовательных 8-битных байт (октетов). Количество же может варьироваться от 1 до 6 байт включительно и определяется самым первым байтом.
  2. Все ASCII-символы (0х00 — 0x7F включительно) записываются как есть одним байтом со сброшенным старшим битом.
  3. Все остальные символы кодируются уже особым образом и далее текст этого раздела касается только их. Чтобы лучше понять принцип, лучше представляйте себе блоки бит с их позицией.
  4. У байт не ASCII-символов старший бит всегда установлен в 1. При этом второй бит всегда сброшен у не первых байт (у первых, соответственно, установлен). Поэтому если чтение производится с произвольного байта, то по второму биту можно определять промежуточные байты.
  5. И у не первых байт остальные 6 младших бит содержат фрагмент кода символа (об этом ниже).

Количество байт, которое отводится под символ, всегда равно количеству идущих подряд старших бит со значением 1 в первом байте. Эти биты всегда завершаются битом со значением 0. Оставшиеся младшие биты первого байта составляют код символа. Отсюда обуславливается ограничение в 6 байт на символ — если выше, то в первом байте уже не хватит места под биты данных. Поэтому последовательности бит 11111110 (0xFE) и 11111111 (0xFF) общепринято считаются не используемыми в UTF-8.

До этого описывалась структура, а теперь про расположение данных.

Как видно из описания выше, каждый байт имеет определённое количество младших бит под данные — переменное у первого и по 6 в последующих. 32-битный код символа последовательно размещается в этих контейнерах. Старшие биты оказываются в первых байтах, а младшие — в последних. Поэтому младшие 6 бит последнего байта всегда содержат биты 0..5 кода символа. Аналогично, предпоследний байт содержат биты 6..11, третий с конца — 12..17, четвёртый — 18..23, пятый — 24..29. Первый байт же содержит оставшиеся старшие биты значения.

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


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

Коды символов Unicode (HEX) Размер в UTF-8 Представленные классы символов
1 байт ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры
2 байта кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания
3 байта все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы
4 байта музыкальные символы, редкие китайские иероглифы, вымершие формы письменности
5 байт не используется в Unicode
6 байт не используется в Unicode

Следует отметить, что данная таблица подразумевает плотное кодирование и поэтому она представляет только идеальные комбинации.

Кодировка UTF-8 не является однозначной, так как в ней учитывается размер бит значения без учёта позиции последнего установленного бита. Поэтому возможно написание «грубого» кодировщика, который не отбрасывает лидирующие нули. Например, ASCII-символ «1» (0x31), может быть представлен следующими двухбайтовыми и трёхбайтовыми последовательностями: 11000000 10110001 (0xC0 0xB1) и 11100000 10000000 10110001 (0xE0 0x80 0xB1). Отсюда выходят следующие бессмыленные битовые комбинации первых байт: 11000000 (0xC0), 11100000 (0xE0), 11110000 (0xF0), 11111000 (0xF8), 1111110 (0xFC), а также последующие за ними комбинации промежуточных байт 10000000 (0x80).

Макет кодовой страницы

В следующей таблице суммируется использование кодовых блоков UTF-8 (отдельных байтов или октетов) в формате кодовой страницы. Верхняя половина (от до ) предназначена для байтов, используемых только в однобайтных кодах, поэтому она выглядит как обычная кодовая страница; Нижняя половина — для байтов продолжения (от до ) и (возможно) ведущих байтов (от до ), и поясняется далее в легенде ниже.

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 и также недействительна.

Неправильная кодировка HTML страниц

Создадим тестовый файлик:

sudo gedit /var/www/html/encoding.html

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

<html>
  <head>
    <title>Проверка кодировки</title>
   </head>
  <body>
    <h1>Тестовый файл для проверки кодировки</h1>
  </body>
</html>

Откроем этот файл в браузере http://localhost/encoding.html

Как можно видеть, кодировка браузером определена неправильно:

Имеется несколько способов исправить эту ситуацию. Начнём с самого простого – явно указать кодировку для веб-страницы. Это делается метатегом, который должен быть расположен внутри тэга head:

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

Добавим эту строку к нашему тестовому файлику, чтобы получилось так:

<html>
  <head>
    <title>Проверка кодировки</title>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
   </head>
  <body>
    <h1>Тестовый файл для проверки кодировки</h1>
  </body>
</html>

Как мы можем убедиться на следующем скриншоте, проблема решена:

Если кодировка вашего файла отличается от UTF-8, то вместо неё поставьте windows-1251 или ту, которая соответствует кодировке веб-страницы. Чтобы научиться определять кодировку файлов, посмотрите эту инструкцию.

Это был самый простой способ исправления проблемы с кодировкой – без изменения настроек сервера.

Вернём наш тестовый файл в исходное состояние и продолжим изучение способов указания кодировки.

Если файлы .htaccess включены настройками Apache, то эти файлы можно использовать чтобы указывать кодировку отправляемых веб-сервером страниц. Чтобы включить поддержку файлов .htaccess в конфигурационном файле Apache ( /etc/apache2/apache2.conf ) найдите группу строк

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>

И в ней замените

AllowOverride None

на

AllowOverride All

После этого сервер нужно перезапустить.

sudo systemctl restart apache2.service

Файл .htaccess должен быть размещён в той же директории, что и сайт. Мой сайт размещён в корневой директории веб-сервера. Если у вас также, то теперь в папке /var/www/html/ создайте файл .htaccess и добавьте в него директиву AddDefaultCharset после которой укажите желаемую кодировку. Примеры

AddDefaultCharset UTF-8

ИЛИ

AddDefaultCharset windows-1251

Можно указать кодировку, которая будет применена только к файлам определённого формата:

AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Набор файлов может быть любым, например:

AddCharset utf-8 .html .css .php .txt .js

Следующий вариант является альтернативным и также позволяет устанавливать кодировку для файлов определённого типа, для него нужно, чтобы был включён mod_headers:

<Files ~ "\.html?$">  
     Header set Content-Type "text/html; charset=utf-8"
</Files>

Ещё один вариант, который также можно использовать в файле .htaccess для установки кодировки UTF-8:

IndexOptions +Charset=utf-8

Если сайт на PHP, то дополнительно может понадобиться продублировать кодировку с php_value default_charset:

AddDefaultCharset windows-1251
php_value default_charset "cp1251"

Можно вместо создания файла .htaccess установить кодировку в конфигурационном файле веб-сервера. Для Apache CentOS/Fedora это файл httpd.conf, а на Debian/Ubuntu это файл apache2.conf. Добавьте следующую строку для установки кодировки и перезапустите веб-сервер, чтобы изменения вступили в силу:

AddDefaultCharset UTF-8

История создания

До появления Unicode UTF-8 широко использовались другие кодировки (ASCII, ISO/IEC 646, ISO/IEC 8859, KOI8, Windows-125x).

Впервые кодировка UTF-8 была официально представлена на конференции USENIX в Сан Диего в январе 1993. От других мультибайтных кодировок ее отличала полная совместимость с ASCII: все символы ASCII в UTF-8 кодируются 7 битами. Каждый символ кодировки, отличный от ASCII, состоит из ведущего байта, указывающего длину последовательности, и одного или нескольких продолжающих байт. Такой принцип позволяет определить длину последовательности только по первому байту. Коды символов ASCII, ведущих и продолжающих байт не пересекаются, что позволяет легко найти начало последовательности простым откатом назад максимум на пять байт.

График изменения популярности кодировок в интернете

В ноябре 2003 года стандартом RFC-3629 максимальная длина последовательности UTF-8 была ограничена четырьмя байтами, однако потенциально UTF-8 позволяет использовать последовательности вплоть до шести байт. На сегодняшний день самой распространенной кодировкой является UTF-8. Она включает в себя более двух миллионов символов: все возможные современные алфавиты, цифры, знаки препинания, математические и специальные символы, музыкальные знаки и символы вымерших форм письменности. А резерва UTF-8 хватит для размещения более двух миллиардов символов. Так что о смене кодировки в ближайшее время задумываться не придётся.

Однако торжество современных технологий — явление относительно новое. Согласно Google, самой распространенной в интернете кодировкой UTF-8 стала только в 2008 году — тогда ее использовали чуть более чем 25% проиндексированных веб-страниц. А еще в 2006 UTF-8 использовали менее чем 10% веб-страниц.


Стремительный рост популярности кодировки UTF-8 связан с целым рядом ее преимуществ перед предшественницами.

Таблицы кодировок[править]

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

С ростом производительности компьютеров стали появляться таблицы кодировок с большим количеством символов. Первой семибитной кодировкой стала ASCII7. В нее уже вошли прописные буквы английского алфавита, арабские цифры, знаки препинания. Затем на ее базе была разработана ASCII8, в которым уже стало возможным хранение символов: основных и еще столько же расширенных. Первая часть таблицы осталась без изменений, а вторая может иметь различные варианты (каждый имеет свой номер). Эта часть таблицы стала заполняться символами национальных алфавитов.

Но для многих языков (например, арабского, японского, китайского) символов недостаточно, поэтому развитие кодировок продолжалось, что привело к появлению UNICODE.

Los caracteres

Los caracteres en las tablas Unicode están numerados con números hexadecimales. Por ejemplo, la letra mayúscula cirílica M denota U + 041C. Esto significa que se sitúa en la intersección de la línea 041 y la columna C. Puede entonces simplemente copiar y pegar en cualquier lugar. Para evitar hurgar en la lista de multilímetro, debe usar la búsqueda. Pasando la página de caracteres, verá un número en el Unicode y la forma en la marca en diferentes tipos de letra. En la barra de búsqueda, se puede conducir en sí una señal, incluso si se elabora en lugar de la caja, al menos, con el fin de averiguar lo que era. Más en este sitio hay un especial (y no al azar) — especial conjuntos de iconos similares recogidos de diferentes secciones para facilitar su uso.

El estándar Unicode es internacional. Incluye los signos de casi todos los idiomas escritos del mundo. Incluyendo aquellos que ya no se aplican. jeroglíficos egipcios, runas germánicas, la escritura maya, la escritura cuneiforme y alfabetos de los estados antiguos. Se presenta la notación de medidas y pesos, notación musical, conceptos matemáticos.

El Consorcio Unicode en sí mismo no inventa nuevos símbolos. En la tabla se agregan los iconos que encuentran su aplicación en la sociedad. Por ejemplo, firmar rublos fue utilizado ampliamente durante los seis años antes de que se añadió. iconos emoji (emoticones), también, en un principio ampliamente utilizados en Japón antes de ser incluidos en la codificación. Sin embargo, las marcas comerciales y logotipos de la empresa no se agregan principio. Incluso tan común como a la niña de Apple o bandera de Windows. Hasta la fecha, en la versión 8.0 se codifica aproximadamente 120.000 caracteres.

[править] BOM (сигнатура)

Многие программы Windows (включая Блокнот) добавляют байты 0xEF, 0xBB, 0xBF в начале любого документа, сохраняемого как UTF-8.

Это метка порядка байтов (англ. Byte Order Mark, BOM), также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature). По наличию сигнатуры программы могут автоматически определить, является ли файл закодированным в UTF-8, однако файлы с такой сигнатурой могут некорректно обрабатываться старыми программами, в частности xml-анализаторами. Такие редакторы, как Notepad++, Notepad2 и Kate, позволяют явно указывать, следует ли добавлять сигнатуру при сохранении UTF-файлов.


Например: В файле записана одна латинская буква «a».

  • Если кодировка этого файла UTF-8 with Signature, то он будет содержать: 0xEF 0xBB 0xBF 0x61
  • Если кодировка этого файла UTF-8 (без сигнатуры), то он будет содержать: 0x61

Если считывающая программа не поддерживает BOM, то эти три байта успешно раскодируются в один Unicode-символ 0xFEFF. Это не разрывающий слова пробел нулевой ширины и поэтому он может не отобразиться. Этот же символ используется в BOM для кодировок UTF-16 и UTF-32.

Многообразие

Кодовые точки Рецепт Сочетание
U+1F469 U+200D U+2764 U+FE0F U+200D U+1F469
U+1F468 U+200D U+1F468 U+200D U+1F467 U+200D U+1F466

В Юникоде версии 8.0 (середина 2015 года) появилось пять символов-модификаторов символов для оттенков человеческой кожи. Эти символы основаны на шести оттенках по шкале Фицпатрика, признанного стандарта в дерматологии (в интернете много примеров этой шкалы, таких как FitzpatrickSkinType.pdf). Точные оттенки зависят от реализации.

Код Название Примеры
U+1F3FB Модификатор эмодзи для шкалы Фицпатрика типы-1-2
U+1F3FC Модификатор эмодзи для шкалы Фицпатрика тип-3
U+1F3FD Модификатор эмодзи для шкалы Фицпатрика тип-4
U+1F3FE Модификатор эмодзи для шкалы Фицпатрика тип-5
U+1F3FF Модификатор эмодзи для шкалы Фицпатрика тип-6

 → 

Стандарт Unicode

В конечном итоге всё вылилось в стандарт Юникода, который худо-бедно, но решает практически все стоявшие перед кодировками проблемы.

С одной стороны, Юникод позволяет кодировать практически неограниченное количество символов. В последнем стандарте определено более 100 000 различных символов всех современных и многих уже мёртвых языков, а также различные иконки и пиктограммы. С другой стороны, некоторые способы кодирования позволяют Юникоду оставаться ASCII-совместимыми. Что позволяет работать, как и раньше многим программам, а также американским и другим англоязычным пользователям, многие из которых появления Юникода даже не заметили. В Юникоде также собраны все символы из всех популярных стандартов кодирования, что позволяет преобразовать в него любой текст из старой кодировки.

Практически все современные программы, работающие с текстом, понимают Юникод. Более того, обычно они в нём и работают. Например, даже когда вы открываете сайт в старой доброй Windows-1251, браузер сначала внутри у себя перекодирует все тексты в Юникод, а потом отображает их. В общем, Юникод, это светлое будущее интернета и всей компьютерной индустрии.

Отличие набора символов от кодировки

Термины «кодировка», «стандарт кодирования», «набор символов» обычно используются, как синонимы, но между ними есть и тонкие различия. Важно понимать разницу между «стандартом» и, собственно, «кодировкой». Некий стандарт просто говорит, что буква «A», это число 65, а буква «B» — 66. Кодировка же отвечает за то, как эти числа представить в памяти компьютера. В эпоху однобайтных кодировок, это различие было практически неуловимо. Число 65 — байт со значением 65 или последовательность битов . Для многобайтных же уже возникают вопросы: сколько байтов использовать, в каком порядке, фиксированное число байтов или нет?

В эпоху однобайтных кодировок, это различие было практически неуловимо. Число 65 — байт со значением 65 или последовательность битов . Для многобайтных же уже возникают вопросы: сколько байтов использовать, в каком порядке, фиксированное число байтов или нет?

То есть в стандарте Юникода определено, что кириллической букве «А» соответствует абстрактное число 1040. Как представить это число в виде последовательности байтов решает уже конкретная кодировка — UTF-8, UTF-16, UTF-32.

То есть текстовый файл не может быть в кодировке «Юникод», а только в конкретной кодировке «UTF-8» или «UTF-16».

Поговорим о цифрах

16

Название Диапазон
1. Основная многоязычная плоскость (от U+0000 до U+FFFF)
2. Дополнительная многоязычная плоскость (от U+10000 до U+1FFFF)
3. Дополнительная идеографическая плоскость (от U+20000 до U+2FFFF)
4. Третичная идеографическая плоскость (от U+30000 до U+3FFFF)
5. Плоскость 5 (не используется) (от U+40000 до U+4FFFF)
6. Плоскость 6 (не используется) (от U+50000 до U+5FFFF)
7. Плоскость 7 (не используется) (от U+60000 до U+6FFFF)
8. Плоскость 8 (не используется) (от U+70000 до U+7FFFF)
9. Плоскость 9 (не используется) (от U+80000 до U+8FFFF)
10. Плоскость 10 (не используется) (от U+90000 до U+9FFFF)
11. Плоскость 11 (не используется) (от U+A0000 до U+AFFFF)
12. Плоскость 12 (не используется) (от U+B0000 до U+BFFFF)
13. Плоскость 13 (не используется) (от U+C0000 до U+CFFFF)
14. Плоскость 14 (не используется) (от U+D0000 до U+DFFFF)
15. Специализированная дополнительная плоскость (от U+E0000 до U+EFFFF)
16. Дополнительная область для частного использования — A (от U+F0000 до U+FFFFF)
17. Дополнительная область для частного использования — B (от U+100000 до U+10FFFF)

С этим читают