Перейти к содержанию

Блоки Unicode

Unicode делит своё кодовое пространство на именованные блоки, каждый — это смежный диапазон, зарезервированный для одного сценария или одного семейства символов. Знание того, в каком блоке живёт символ, превращает тайну — почему эта вставка сломалась, почему это регулярное выражение её пропускает — в ответный вопрос.

Имена блоков — это идентификаторы, а не описания: они используются буквально в регулярном выражении как \p{Block=Cyrillic} и в каждом файле данных Unicode, поэтому они остаются на английском на каждом языке. Что переводится, это предложение рядом с ними.

Это тщательный отбор, а не все примерно 340 блоков — те, которые возникают при работе с текстом. Таблица ASCII охватывает первый блок полностью; эта страница начинается с того места, где заканчивается эта.

Латинский

5

Латинский распределяется по нескольким блокам, поэтому его соответствие по блоку никогда полностью не работает.

ДиапазонБлокЧто в этомОбразец
U+0000–U+007FBasic LatinASCII, без изменений: латинские буквы, цифры, пунктуация, коды управленияA z 0 ?
U+0080–U+00FFLatin-1 SupplementЗападноевропейские акценты, плюс £ § × ÷ и неразрывное пространствоé ñ ü ×
U+0100–U+017FLatin Extended-AЦентрально- и восточноевропейские акценты — č, ł, ő, șč ł ő š
U+0180–U+024FLatin Extended-BДополнительные письма для африканских и фонетических ортографийƒ ǎ ȳ
U+1E00–U+1EFFLatin Extended AdditionalВьетнамский и другие многоакцентные латинские письмаạ ế ṛ

Объединённые знаки и модификаторы

4

Они прилагаются к персонажу перед ними и не имеют ширины самих по себе.

ДиапазонБлокЧто в этомОбразец
U+0300–U+036FCombining Diacritical MarksАкценты, применяемые к предыдущему символуВторой, разложенный способ написания é. Нормализуйте на NFC, чтобы схлопнуть его.◌́ ◌̈ ◌̌
U+02B0–U+02FFSpacing Modifier LettersНадстрочные буквы и IPA и знаки тонаʰ ˈ ˚
U+FE00–U+FE0FVariation SelectorsНевидимые селекторы, выбирающие текст или представление эмодзиVS16 — это то, что превращает ✔ в эмодзи. Невидимо, но это считается.
U+FE20–U+FE2FCombining Half MarksПоловины знаков, охватывающих два символа

Другие сценарии

8
ДиапазонБлокЧто в этомОбразец
U+0370–U+03FFGreek and CopticГреческий и копты письма, которые делят его блокα Ω π
U+0400–U+04FFCyrillicРусский, украинский, сербский, болгарский и связанные алфавитыд Я ж
U+0590–U+05FFHebrewЕврейские письма, гласные точки и кантильные знакиא ש
U+0600–U+06FFArabicАрабские письма в их изолированных формахا ب ي
U+0900–U+097FDevanagariХинди, санскрит, маратхи и связанные языкиक ह
U+0E00–U+0E7FThaiТайские согласные, гласные и тональные знакиก ท
U+10A0–U+10FFGeorgianГрузинский Mkhedruliა ბ
U+1F00–U+1FFFGreek ExtendedПолитонический греческий — акценты классических текстовᾰ ῶ

Пунктуация и числа

5

Источник большинства невидимых символов, которые выживают при копировании.

ДиапазонБлокЧто в этомОбразец
U+2000–U+206FGeneral PunctuationТире, кудрявые кавычки, многоточие — и большинство невидимых пространствU+200B ноль-ширины пространства и U+2060 соединитель слов живут здесь.– — “ ” …
U+2070–U+209FSuperscripts and SubscriptsНадстрочные и подстрочные цифры и письма⁰ ⁴ ₂
U+20A0–U+20CFCurrency SymbolsЗнаки валют, которых нет в Latin-1 — €, ₴, ₹, ₺€ ₴ ₺
U+2100–U+214FLetterlike SymbolsСимволы построены из писем — ™, №, ℃, ℓ™ ℃ №
U+2150–U+218FNumber FormsВульгарные доли и римские цифры как отдельные символы⅓ ⅕ Ⅷ

Символы и рисование

9
ДиапазонБлокЧто в этомОбразец
U+2190–U+21FFArrowsСтрелки в каждом направлении, одиночные и двойные← ↔ ⇒
U+2200–U+22FFMathematical OperatorsМатематические операторы — ∀, ∑, ≠, ∞∀ ∑ ≠
U+2300–U+23FFMiscellaneous TechnicalКлавиатура и технические символы — ⌘, ⌥, ⌫, ⏎⌘ ⌥ ⏎
U+2500–U+257FBox DrawingЛинии и углы для терминальных коробок и таблиц─ ┌ ╬
U+2580–U+259FBlock ElementsТвёрдые и затенённые блоки, используемые для диаграмм терминала█ ▓ ░
U+25A0–U+25FFGeometric ShapesКвадраты, круги, треугольники и ромбы■ ● ▲
U+2600–U+26FFMiscellaneous SymbolsПогода, астрология, шахматы, карты и костюмы карт☀ ★ ♥
U+2700–U+27BFDingbatsУкрашения принтера — галочки, ножницы, звёзды✂ ✓ ➜
U+2800–U+28FFBraille PatternsВсе 256 узоры точек Брайля, используемые для графики терминала⠁ ⣿

CJK и полная ширина

6

Формы полной ширины — отдельные символы от их близнецов ASCII, а не шрифт.

ДиапазонБлокЧто в этомОбразец
U+3000–U+303FCJK Symbols and PunctuationИдеографическое пространство и пунктуация CJKU+3000 — это пространство полной ширины и не обрезается большинством правил пробелов.  、 。
U+3040–U+309FHiraganaЯпонский слоговой слог для родных слов и грамматикиあ ん
U+30A0–U+30FFKatakanaЯпонский слоговой слог для иностранных слов и акцентовア ン
U+4E00–U+9FFFCJK Unified IdeographsОсновной блок Han — почти 21 000 символов, общие для китайского, японского и корейского языков日 本 語
U+AC00–U+D7AFHangul SyllablesВсе 11 172 предварительно составленных корейских слоговКаждый также может быть написан как отдельный Jamo, который нормализация согласует.한 글
U+FF00–U+FFEFHalfwidth and Fullwidth FormsПолная ширина копии ASCII и половинной ширины KatakanaA — это не A. Текст, вставленный из форм CJK, часто требует сворачивания в ASCII.A ! ア

Выше U+FFFF и специальные случаи

10

Что-либо здесь занимает две единицы UTF-16, которые обуславливают ошибки длины строки.

ДиапазонБлокЧто в этомОбразец
U+D800–U+DB7FHigh SurrogatesПервая половина пары UTF-16 — никогда не допустимо самостоятельноОдин суррогат — это то, что строка разрезанная через эмодзи оставляет позади.
U+DC00–U+DFFFLow SurrogatesВторая половина пары UTF-16 — никогда не допустимо самостоятельно
U+E000–U+F8FFPrivate Use AreaНеназначенный конструкцией для частных соглашенийГде шрифты значков помещают глифы. Бессмыслено без соответствующего шрифта.
U+FFF0–U+FFFFSpecialsСимвол замены и роды порядка байтовU+FFFD — это то, что вы видите, когда декодер отказался от байта.
U+1D400–U+1D7FFMathematical Alphanumeric SymbolsПолужирный, курсив, сценарий и двойной гарнитур алфавиты как символыИсточник 𝐟𝐚𝐤𝐞 𝐛𝐨𝐥𝐝 в именах социальных сетей. Невозможно проводить поиск.𝐀 𝓪 𝟙
U+1F300–U+1F5FFMiscellaneous Symbols and PictographsБольшинство не-лицевых эмодзи — погода, объекты, места, символы🌍 🔥 📄
U+1F600–U+1F64FEmoticonsЛицевой эмодзи😀 🙂
U+1F680–U+1F6FFTransport and Map SymbolsТранспортные средства, дорожные и карты символы🚀 🛑
U+1F900–U+1F9FFSupplemental Symbols and PictographsБолее поздние добавления эмодзи — более поздние лица, жесты, объекты🤖 🧠
U+E0000–U+E007FTagsНевидимые символы меток, используемые в последовательностях флаговТакже вектор для невидимого текста, контрабандой внутри нормально выглядящей строки.

FAQ

В чём разница между блоком и скриптом?
Блок — это смежный диапазон кодовых точек; сценарий — это система письма, к которой принадлежит символ. Это не одно и то же, и часто они не согласны — латинские символы распределены как минимум по семи блокам, и блок Combining Diacritical Marks используется несколькими скриптами одновременно. В регулярном выражении \p{Script=Latin} почти всегда то, что вам нужно, а не \p{Block=…}.
Почему строки суррогата не имеют примеров символов?
Потому что суррогат — это не символ. U+D800–U+DFFF зарезервированы как механизм пары для UTF-16: два из них вместе кодируют одну кодовую точку выше U+FFFF. Сами по себе они невалидны, что ровно почему строка, разрезанная посредине эмодзи, производит символ замены — вы держали половину пары.
Почему мой акцентированный символ иногда считается двумя?
Потому что есть два способа написать его. é может быть одной кодовой точкой из Latin-1 Supplement, или e, за которым следует объединённый акцент острый из блока Combining Diacritical Marks. Они выглядят одинаково и сравниваются как неравные. Нормализация в NFC схлопывает вторую форму в первую, и это то, для чего предназначен инструмент нормализации.
Это ли один символ эмодзи?
Редко. Один отображаемый эмодзи часто состоит из нескольких кодовых точек — базовый символ, модификаторы тона кожи, селекторы вариантов и нулевые соединители, связывающие семью вместе. Длина 1 — это исключение, а не правило, и любой код, который нарезает строки по индексу, в конечном итоге разделит один.