Перед вами обновляемый список самых замечательных «вкусностей» Юникода, а также пакетов и ресурсов
Юникод — это потрясающе! До его появления международная коммуникация была изнурительной: каждый определял свой отдельный расширенный набор символов в верхней половине ASCII (так называемые кодовые страницы). Это порождало конфликты. Просто подумайте, что немцам приходилось договариваться с корейцами, где чья кодовая страница на 127 символа. К счастью, появился Юникод и унифицировал коммуникации. Стандарт Юникод 8.0 охватывает более 120 000 символов из более 129 письменностей. И современные, и древние, и до сих пор не расшифрованные. Юникод поддерживает текст слева направо и справа налево, наложение символов и включает самые разные культурные, политические, религиозные символы и эмодзи. Юникод потрясающе человечен, а его возможности сильно недооцениваются.
Содержание
- Краткое введение
- Список удивительных символов
- Причуды и устранение неполадок
- Отличные пакеты и библиотеки
- Эмодзи
- Переменные и методы с креативными названиями
- Шрифты Юникода
- Дополнительные ресурсы
- Более глубокое исследование самого Юникода
- Общая карта
- Принципы Стандарта Юникод
- Версии Юникода
Краткое введение
Какие символы входят в Стандарт Юникод?
Стандарт Юникод определяет коды для символов основных современных языков. Это европейские алфавитные письменности, ближневосточные письменности справа налево и многие письменности Азии.
Стандарт также содержит знаки пунктуации, диакритические знаки, математические символы, технические символы, стрелки, дингбаты, эмодзи и т. д. Он предоставляет коды для диакритических знаков, изменяющих знаки символов, такие как тильда (~). Они используются в сочетании с основными для представления акцентированных символов (например, ñ). В целом, Юникод версии 9.0 предоставляет коды для 128 172 символов из мировых алфавитов, наборов идеограмм и коллекций символов.
Большинство символов общего пользования помещаются в первые 64K кодовых точек, область кодового пространства, которая называется основной многоязычной плоскостью, или BMP для краткости. Есть ещё шестнадцать других дополнительных плоскостей, доступных для кодирования других символов, с более чем 850 000 неиспользуемых кодовых точек. Они могут пригодиться для добавления новых символов в будущие версии стандарта.
Стандарт Юникод также резервирует кодовые точки для частного использования. Вендоры или конечные пользователи могут назначать их в своих собственных системах для своих символов или использовать со специализированными шрифтами. На BMP находится 6400 кодовых точек для частного использования и ещё 131 068 дополнительных кодовых точек частного использования, если 6400 недостаточно для конкретных приложений.
Кодировки символов Юникода
Стандарты кодирования символов определяют не только идентичность каждого символа и его числовое значение или кодовую точку, но и то, как это значение представлено в битах.
Стандарт Юникод определяет три формы кодирования, которые позволяют передавать одни и те же данные: это байт, слово и двойное слово (то есть 8, 16 или 32 бит на единицу кода). Все три формы кодируют один и тот же общий набор символов и могут быть эффективно преобразованы друг в друга без потери данных. Консорциум Юникод полностью одобряет использование любой из этих форм кодирования в качестве согласованного способа реализации Стандарта Юникод.
UTF-8 популярен для HTML и подобных протоколов. UTF-8 — это способ преобразования всех символов Юникода в кодировку переменной байтовой длины. Его преимущество в том, что символы Юникода, соответствующие знакомому набору ASCII, имеют те же байтовые значения, что и ASCII, а символы Юникода, преобразованные в UTF-8, могут использоваться с большим количеством существующего программного обеспечения без серьёзной доработки ПО.
UTF-16 популярен во многих средах, где необходимо сбалансировать эффективный доступ к символам с экономичным хранением. Он достаточно компактен, и все часто используемые символы помещаются в один 16-битный кодовый блок, в то время как все остальные символы доступны через пары 16-битных кодовых блоков.
UTF-32 полезен там, где объём памяти не вызывает беспокойства, но требуется доступ к символам по единому коду фиксированной ширины. Здесь каждый символ Юникода кодируется в одном 32-разрядном кодовом блоке.
Все три формы кодирования требуют для каждого символа не более 4 байт (или 32 бит).
Поговорим о цифрах
Набор символов Юникода разделён на 17 основных сегментов (плоскостей), которые далее делятся на блоки. В каждой плоскости есть место для 65 536 (216) кодовых точек, что создаёт в сумме 1 114 112 кодовых точек. Есть две «плоскости частного использования» (№ 16 и № 17), которые выделяются для использования на усмотрение компаний/пользователей. В них 131 072 кодовые точки.
№ | Название | Диапазон |
---|---|---|
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) |
Первая плоскость называется основной многоязычной плоскостью или BMP. Она содержит кодовые точки от U+0000 до U+FFFF, то есть наиболее часто используемые символы. Остальные шестнадцать плоскостей (U+010000 → U+10FFFF) называются дополнительными или астральными.
Суррогатные пары UTF-16
Символы вне основной плоскости, как тетраграмматон, означающий центр (U+1D306), можно закодировать в UTF-16 только двумя 16-битными кодовыми единицами: 0xD834 0xDF06. Это называется суррогатной парой. Обратите внимание, что суррогатная пара представляет только один символ.
Первая кодовая единица суррогатной пары всегда находится в диапазоне от 0xD800 до 0xDBFF и называется верхней частью пары.
Вторая кодовая единица суррогатной пары всегда находится в диапазоне от 0xDC00 до 0xDFFF и называется нижней частью пары.
Суррогатная пара: представление одного абстрактного символа, состоящего из последовательности двух 16-разрядных кодовых единиц, где первое значение пары является верхней суррогатной кодовой единицей, а второе — нижней суррогатной кодовой единицей. Суррогатные пары используются только в UTF-16.
Вычисление суррогатных пар
Юникодовский символ «Куча дерьма» (U+1F4A9) в UTF-16 придётся кодировать как суррогатную пару, т. е. два суррогата. Чтобы преобразовать любую кодовую точку в суррогатную пару, используйте такой алгоритм (на JavaScript). Имейте в виду, что мы используем шестнадцатеричную нотацию.
var High_Surrogate = function(Code_Point){ return Math.floor((Code_Point - 0x10000) / 0x400) + 0xD800 };
var Low_Surrogate = function(Code_Point){ return (Code_Point - 0x10000) % 0x400 + 0xDC00 };
// Reverses The Conversion
var Code_Point = function(High_Surrogate, Low_Surrogate){
return (High_Surrogate - 0xD800) * 0x400 + Low_Surrogate - 0xDC00 + 0x10000;
};
> var codepoint = 0x1F4A9; // 0x1F4A9 == 128169
> High_Surrogate(codepoint).toString(16)
"d83d" // 0xD83D == 55357
> Low_Surrogate(codepoint).toString(16)
"dca9" // 0xDCA9 == 56489
> String.fromCharCode( High_Surrogate(codepoint) , Low_Surrogate(codepoint) );
""
> String.fromCodePoint(0x1F4A9)
""
> 'ud83dudca9'
""
Композиция и декомпозиция
Юникод включает в себя механизм для изменения формы символа, который значительно расширяет поддерживаемый набор глифов. Это касается комбинируемых диакритических знаков. Они вставляются после главного знака. На один и тот же знак можно наложить несколько комбинируемых диакритических знаков. Юникод также содержит предварительно составленные версии большинства таких комбинаций для нормального использования.
Некоторые последовательности символов также можно представить в виде одного символа, который называется предварительно составленным символом (precomposed character), он же составной символ (composite character). Например, символ [ü] можно закодировать как единственную кодовую точку U+00FC или как базовый символ U+0075 (u), за которым следует несамостоятельный знак U+0308 (¨). Стандарт Юникод кодирует составные символы для совместимости с установленными стандартами, такими как Latin 1, который включает в себя множество составных символов, таких как [ü] и [ñ].
Составные символы можно разложить для согласованности или анализа. Например, при сортировке имён по алфавиту символ [ü] можно разложить на [u], за которым следует несамостоятельный знак [¨]. После такой декомпозиции алгоритму проще работать с последовательностью символов. Это позволяет упростить сортировку в языках, где модификаторы символов не влияют на алфавитный порядок. Стандарт Юникод устанавливает порядок декомпозиции для всех составных символов. Он также определяет формы нормализации для обеспечения уникальных представлений символов.
Мифы о Юникоде
Из слайдов презентации Марка Дэвиса «Мифы Юникода».
- Юникод — это просто 16-битный код. — Некоторые ошибочно полагают, что Юникод — это просто 16-битный код, в котором каждый символ занимает 16 бит, и поэтому существует 65 536 возможных символов. На самом деле это не совсем так. Это самый распространённый миф о Юникоде, так что если вы тоже так думали раньше, не расстраивайтесь.
- Можно взять для своих нужд любую кодовую точку, которая не используется. — Нет. Когда-нибудь это место займёт другой символ. Вместо этого используйте плоскости для частного использования или области без символов в каждой плоскости, где по стандарту не будет никаких символов.
- Каждая кодовая точка Юникода представляет символ. — Нет. Есть много точек без символов (FFFE, FFFF, 1FFFE и др.) Кроме того, суррогатные кодовые точки, приватные и неиспользуемые кодовые точки, а также управляющие/форматирующие «символы» (RLM, ZWNJ и др.)
- В Юникоде заканчивается место. — Если бы оно заполнялось линейно, то закончилось бы в 2140 году. Но место не заполняется линейно. Планы на будущее см. здесь.
- Все знаки сопоставляются один к одному. — Нет. Возможны варианты:
- Один ко многим: (β → SS)
- С учётом контекста: (…Σ ←→ …ς и в то же время …ΣΤ… ←→ …στ…)
- С учётом локали: (I ←→ ı и в то же время İ ←→ i)
Прикладные кодировки Юникода
Тип кодирования | Пример |
---|---|
Объект HTML (десятичный) | |
Объект HTML (hex) | |
Управляющий код URL | %F0%9F%96%96 |
UTF-8 (hex) | 0xF0 0x9F 0x96 0x96 (f09f9696) |
UTF-8 (бинарный) | 11110000:10011111:10010110:10010110 |
UTF-16/UTF-16BE (hex) | 0xD83D 0xDD96 (d83ddd96) |
UTF-16LE (hex) | 0x3DD8 0x96DD (3dd896dd) |
UTF-32/UTF-32BE (hex) | 0x0001F596 (0001f596) |
UTF-32LE (hex) | 0x96F50100 (96f50100) |
Восьмеричная управляющая последовательность | 360237226226 |
Исходный код
Тип кодирования | Пример |
---|---|
JavaScript | u1F596 |
JSON | u1F596 |
C | u1F596 |
C++ | u1F596 |
Java | u1F596 |
Python | u1F596 |
Perl | x{1F596} |
Ruby | u{1F596} |
CSS | 1F596 |
Список удивительных символов
Совместный доступ к документу может быстро превратить редактирование в письменную рэп-битву, ведущуюся все более запутанной расстановкой управляющих от U+202a до U+202e
Специальные символы
Консорциум Unicode опубликовал диаграмму общей пунктуации, где можете найти более подробную информацию.
Символ | Название | Описание |
---|---|---|
'' |
U+FEFF Неразрывный пробел нулевой ширины (Byte Order Mark — BOM) | Обладает важным свойством однозначности при изменении порядка байтов. У него также нулевая ширина и невидимость. В неподходщем программном обеспечении (например, интерпретаторе PHP) это приводит к всевозможным примерам забавного поведения. |
'' |
'uFFEF' Обратный BOM | Не приравнивается к символу, кроме начала текста. |
'' |
'u200B' Неразрывное пространство нулевой ширины | Символ без внешнего вида и без эффекта, кроме предотвращения образования лигатур. |
' ' |
U+00A0 Неразрывный пробел | Заставляет соседние символы держаться вместе. Хорошо известен как в HTML. |
'' |
U+00AD Мягкий дефис | В HTML работает как пространство нулевой ширины, но при встрече с концом строки (и только в этом случае) показывает дефис. |
'' |
U+200D Знак нулевой ширины (с объединением) | Заставляет соединяться соседние символы (например, арабские символы или поддерживаемые эмодзи). Можно использовать для последовательно скомбинированных эмодзи. |
'' |
U+2060 Соединитель слов | То же самое, что и U+00A0, но совершенно невидимый. Хорошо подходит для @font-face в Twitter. |
' ' |
U+1680 Огам знак пробела | Отмечает пробел, который выглядит как тире. Отлично паодходит, чтобы приблизить программистов к безумию: 1 + 2 === 3. |
';' |
U+037E Греческий знак вопроса | Похож на точку с запятой. Также забавный способ троллить разработчиков. |
'' |
U+202D | Изменяет направление текста слева-направо. |
'' |
U+202E | Изменяет направление текста справа-налево. |
'ꓸ' |
U+A4F8 Лису буква tone mya ti | Двойник для точки. |
'ꓹ' |
U+A4F9 Лису буква tone na po | Двойник для запятой. |
'ꓼ' |
U+A4FC Лису буква tone mya na | Двойник для точки с запятой. |
'ꓽ' |
U+A4FD Лису буква tone mya jeu | Двойник для двоеточия. |
'︀' |
Вариантные селекторы (от U+FE00 до U+FE0F и от U+E0100 до U+E01EF) | Блок из 256 символов нулевой ширины, которые обладают свойством ID_Continue, то есть могут использоваться в именах переменных (не первая буква). Что делает их особенными, так это то, что над ними проходит курсор мыши, поскольку они объединяют символы, в отличие от большинства других символов нулевой ширины. |
'ᅟ' |
U+115F Заполнитель хангыль чхосон | По сути, заполняет пространство. Визуализируется как символ нулевой ширины (невидимый), если явно не поддерживается при визуализации. Обозначен как ID_Start |
'ᅠ' |
U+1160 Заполнитель чунсон | Возможно, заполняет пространство? Визуализируется как символ нулевой ширины (невидимый), если явно не поддерживается при визуализации. Обозначен как ID_Start |
'ㅤ' |
U+3164 Заполнитель хангыль | В целом, заполняет пространство. Визуализируется как символ нулевой ширины (невидимый), если явно не поддерживается при визуализации. Обозначен как ID_Start |
Подожди… что я только что прочитал?
Идентификаторы переменных могут включать пробелы!
U+3164 Заполнитель хангыль отображается в виде широкого пробела. Если символ явно не поддерживается в рендеринге, то отображается как полностью невидимый (и не занимает место, т. е. «нулевой ширины»). Это означает, что вы никогда не увидите уродливый символ замены символов (�).
Я пока не уверен, почему U+3164 указано вести себя таким образом. Интересно, что U+3164 был добавлен в Юникод в версии 1.1 (1993) — так что у специалистов Консорциума было много времени, чтобы его продумать. Во всяком случае, вот несколько примеров.
> var ᅟ = 'foo';
undefined
> ᅟ
'foo'
> var ㅤ= alert;
undefined
> var foo = 'bar'
undefined
> if ( foo ===ㅤ`baz` ){} // alert
undefined
> var varㅤfooㅤu{A60C}ㅤπ = 'bar';
undefined
> varㅤfooㅤꘌㅤπ
'bar'
**Примечание:** я тестировал рендеринг U+3164 на Ubuntu и OS X со следующими параметрами: `node`, `php`, `ruby`, `python3.5`, `scala`, `vim`, `cat`, `chrome`+`github gist'. Atom — единственная система, которая терпит неудачу, (некорректно) отображая пустые поля. Мне ещё предстоит проверить код в Emacs и Sublime. Насколько я понимаю, Консорциум Юникод не будет переназначать или переименовывать символы или кодовые точки, но его можно убедить изменить свойства символов, таких как ID_Start и ID_Continue.
Модификаторы
Объединитель нулевой ширины (ZWJ) является непечатным символом в компьютерном наборе некоторых сложных шрифтов, таких как арабский или любой индийский шрифт. При помещении между двумя символами, которые в противном случае не были бы связаны, ZWJ заставляет их печататься в объединённой форме.
Разъединитель нулевой ширины (ZWNJ) — это непечатный символ в компьютерных наборах письменностей с лигатурами. При размещении между двумя символами, которые в противном случае были бы соединены в лигатуру, ZWNJ заставляет их печататься в их окончательной и первоначальной формах, соответственно. Действует как пробел, но используется в том случае, когда желательно удерживать слова рядом друг с другом или соединить слово с его морфемой.
> 'a'
"a"
> 'au{0308}'
"ä"
> 'au{20DE}u{0308}'
"a⃞̈"
> 'au{20DE}u{0308}u{20DD}'
"a⃞̈⃝"
// Modifying Invisible Characters
> 'u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}'
""
> 'u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}u{200E}'.length
10
Коллизии преобразований в верхнем регистре
Символ | Кодовая точка | Результат |
---|---|---|
ß | 0x00DF | SS |
ı | 0x0131 | I |
ſ | 0x017F | S |
ff | 0xFB00 | FF |
fi | 0xFB01 | FI |
fl | 0xFB02 | FL |
ffi | 0xFB03 | FFI |
ffl | 0xFB04 | FFL |
ſt | 0xFB05 | ST |
st | 0xFB06 | ST |
Коллизии преобразований в нижнем регистре
Символ | Кодовая точка | Результат |
---|---|---|
K | 0x212A | k |
Причуды и устранение неполадок
- Длина строки обычно определяется по количеству кодовых точек. Это означает, что суррогатные пары будут считаться двумя символами. На символ может быть наложено нескольких диакритических знаков:
a + ̈ == ̈a
. Это увеличивает длину строки, производя только один символ. - Аналогично, обращение строки часто становится нетривиальной задачей. Опять же, суррогатные пары и диакритические знаки следует обращать вместе. ES Reverser предлагает довольно хорошее решение.
- Сопоставления верхнего и нижнего регистра не всегда совпадают. Они могут выражаться и такими отношениями:
- Один ко многим: (ß → SS )
- С учётом контекста: (…Σ ←→ …ς и …ΣΤ… ←→ …στ… )
- С учётом локали: ( I ←→ ı и İ ←→ i )
Сопоставления одного ко многим
Большинство нижеприведенных символов выражают свои сопоставления «один ко многим» в верхнем регистре, а другие в нижнем. В принципе, список можно разделить на две части.
Кодовая точка Символ Название Сопоставленный символ Сопоставленные кодовые точки U+00DF ß
Латинская строчная буква эсцет (S острое) s
,s
U+0073, U+0073 U+0130 İ
Латинская заглавная буква «I» с точкой сверху i
,̇
U+0069, U+0307 U+0149 ʼn
Латинская строчная буква «n» предшествующим апострофом ʼ
,n
U+02BC, U+006E U+01F0 ǰ
Латинская строчная буква «j» с гачеком j
,̌
U+006A, U+030C U+0390 ΐ
Греческая строчная буква йота с диалитика и тонос ι
,̈
,́
U+03B9, U+0308, U+0301 U+03B0 ΰ
Греческая строчная буква ипсилон с диалитика и тонос υ
,̈
,́
U+03C5, U+0308, U+0301 U+0587 և
Армянская строчная лигатура ech yiwn ե
,ւ
U+0565, U+0582 U+1E96 ẖ
Латинская строчная буква h с линией снизу h
,̱
U+0068, U+0331 U+1E97 ẗ
Латинская строчная буква t с диэрезисом t
,̈
U+0074, U+0308 U+1E98 ẘ
Латинская строчная буква w с кольцом выше w
,̊
U+0077, U+030A U+1E99 ẙ
Латинская строчная буква y с кольцом выше y
,̊
U+0079, U+030A U+1E9A ẚ
Латинская строчная буква a с правой половинкой кольца a
,ʾ
U+0061, U+02BE U+1E9E ẞ
Латинская заглавная буква острая s s
,s
U+0073, U+0073 U+1F50 ὐ
Греческая строчная буква ипсилон с псили υ
,̓
U+03C5, U+0313 U+1F52 ὒ
Греческая строчная буква ипсилон с псили и вария υ
,̓
,̀
U+03C5, U+0313, U+0300 U+1F54 ὔ
Греческая строчная буква ипсилон с псили и оксия υ
,̓
,́
U+03C5, U+0313, U+0301 U+1F56 ὖ
Греческая строчная буква ипсилон с псили и периспоменти υ
,̓
,͂
U+03C5, U+0313, U+0342 U+1F80 ᾀ
Греческая строчная буква альфа с псили и ипогеграммены ἀ
,ι
U+1F00, U+03B9 U+1F81 ᾁ
Греческая строчная буква альфа с дасия и ипогеграммены ἁ
,ι
U+1F01, U+03B9 U+1F82 ᾂ
Греческая строчная буква альфа с псили и вария и ипогеграммены ἂ
,ι
U+1F02, U+03B9 U+1F83 ᾃ
Греческая строчная буква альфа с дасия и вария и ипогеграммены ἃ
,ι
U+1F03, U+03B9 U+1F84 ᾄ
Греческая строчная буква альфа с псили и оксия и ипогеграммены ἄ
,ι
U+1F04, U+03B9 U+1F85 ᾅ
Греческая строчная буква альфа с дасия и оксия и ипогеграммены ἅ
,ι
U+1F05, U+03B9 U+1F86 ᾆ
Греческая строчная буква альфа с псили и периспоменти и ипогеграммены ἆ
,ι
U+1F06, U+03B9 U+1F87 ᾇ
Греческая строчная буква альфа с дасия и периспоменти и ипогеграммены ἇ
,ι
U+1F07, U+03B9 U+1F88 ᾈ
Греческая заглавная буква альфа с псили и просгеграммены ἀ
,ι
U+1F00, U+03B9 U+1F89 ᾉ
Греческая заглавная буква альфа с дасия и просгеграммены ἁ
,ι
U+1F01, U+03B9 U+1F8A ᾊ
Греческая заглавная буква альфа с псили и вария и просгеграммены ἂ
,ι
U+1F02, U+03B9 U+1F8B ᾋ
Греческая заглавная буква альфа с дасия и вария и просгеграммены ἃ
,ι
U+1F03, U+03B9 U+1F8C ᾌ
Греческая заглавная буква альфа с псили и оксия и просгеграммены ἄ
,ι
U+1F04, U+03B9 U+1F8D ᾍ
Греческая заглавная буква альфа с дасия и оксия и просгеграммены ἅ
,ι
U+1F05, U+03B9 U+1F8E ᾎ
Греческая заглавная буква альфа с псили и периспоменти и просгеграммены ἆ
,ι
U+1F06, U+03B9 U+1F8F ᾏ
Греческая заглавная буква альфа с дасия и периспоменти и просгеграммены ἇ
,ι
U+1F07, U+03B9 U+1F90 ᾐ
Греческая строчная буква эта с псили и ипогеграммены ἠ
,ι
U+1F20, U+03B9 U+1F91 ᾑ
Греческая строчная буква эта с дасия и ипогеграммены ἡ
,ι
U+1F21, U+03B9 U+1F92 ᾒ
Греческая строчная буква эта с псили и вария и ипогеграммены ἢ
,ι
U+1F22, U+03B9 U+1F93 ᾓ
Греческая строчная буква эта с дасия и вария и ипогеграммены ἣ
,ι
U+1F23, U+03B9 U+1F94 ᾔ
Греческая строчная буква эта с псили и оксия и ипогеграммены ἤ
,ι
U+1F24, U+03B9 U+1F95 ᾕ
Греческая строчная буква эта с дасия и оксия и ипогеграммены ἥ
,ι
U+1F25, U+03B9 U+1F96 ᾖ
Греческая строчная буква эта с псили и периспоменти и ипогеграммены ἦ
,ι
U+1F26, U+03B9 U+1F97 ᾗ
Греческая строчная буква эта с дасия и периспоменти и ипогеграммены ἧ
,ι
U+1F27, U+03B9 U+1F98 ᾘ
Греческая заглавная буква эта с псили и просгеграммены ἠ
,ι
U+1F20, U+03B9 U+1F99 ᾙ
Греческая заглавная буква эта с дасия и просгеграммены ἡ
,ι
U+1F21, U+03B9 U+1F9A ᾚ
Греческая заглавная буква эта с псили и вария и просгеграммены ἢ
,ι
U+1F22, U+03B9 U+1F9B ᾛ
Греческая заглавная буква эта с дасия и вария и просгеграммены ἣ
,ι
U+1F23, U+03B9 U+1F9C ᾜ
Греческая заглавная буква эта с псили и оксия и просгеграммены ἤ
,ι
U+1F24, U+03B9 U+1F9D ᾝ
Греческая заглавная буква эта с дасия и оксия и просгеграммены ἥ
,ι
U+1F25, U+03B9 U+1F9E ᾞ
Греческая заглавная буква эта с псили и периспоменти и просгеграммены ἦ
,ι
U+1F26, U+03B9 U+1F9F ᾟ
Греческая заглавная буква эта с дасия и периспоменти и просгеграммены ἧ
,ι
U+1F27, U+03B9 U+1FA0 ᾠ
Греческая строчная буква омега с псили и ипогеграммены ὠ
,ι
U+1F60, U+03B9 U+1FA1 ᾡ
Греческая строчная буква омега с дасия и ипогеграммены ὡ
,ι
U+1F61, U+03B9 U+1FA2 ᾢ
Греческая строчная буква омега с псили и вария и ипогеграммены ὢ
,ι
U+1F62, U+03B9 U+1FA3 ᾣ
Греческая строчная буква омега с дасия и вария и ипогеграммены ὣ
,ι
U+1F63, U+03B9 U+1FA4 ᾤ
Греческая строчная буква омега с псили и оксия и ипогеграммены ὤ
,ι
U+1F64, U+03B9 U+1FA5 ᾥ
Греческая строчная буква омега с дасия и оксия и ипогеграммены ὥ
,ι
U+1F65, U+03B9 U+1FA6 ᾦ
Греческая строчная буква омега с псили и периспоменти и ипогеграммены ὦ
,ι
U+1F66, U+03B9 U+1FA7 ᾧ
Греческая строчная буква омега с дасия и периспоменти и ипогеграммены ὧ
,ι
U+1F67, U+03B9 U+1FA8 ᾨ
Греческая заглавная буква омега с псили и просгеграммены ὠ
,ι
U+1F60, U+03B9 U+1FA9 ᾩ
Греческая заглавная буква омега с дасия и просгеграммены ὡ
,ι
U+1F61, U+03B9 U+1FAA ᾪ
Греческая заглавная буква омега с псили и вария и просгеграммены ὢ
,ι
U+1F62, U+03B9 U+1FAB ᾫ
Греческая заглавная буква омега с дасия и вария и просгеграммены ὣ
,ι
U+1F63, U+03B9 U+1FAC ᾬ
Греческая заглавная буква омега с псили и оксия и просгеграммены ὤ
,ι
U+1F64, U+03B9 U+1FAD ᾭ
Греческая заглавная буква омега с дасия и оксия и просгеграммены ὥ
,ι
U+1F65, U+03B9 U+1FAE ᾮ
Греческая заглавная буква омега с псили и периспоменти и просгеграммены ὦ
,ι
U+1F66, U+03B9 U+1FAF ᾯ
Греческая заглавная буква омега с дасия и периспоменти и просгеграммены ὧ
,ι
U+1F67, U+03B9 U+1FB2 ᾲ
Греческая строчная буква альфа с вария и ипогеграммены ὰ
,ι
U+1F70, U+03B9 U+1FB3 ᾳ
Греческая строчная буква альфа с ипогеграммены α
,ι
U+03B1, U+03B9 U+1FB4 ᾴ
Греческая строчная буква альфа с оксия и ипогеграммены ά
,ι
U+03AC, U+03B9 U+1FB6 ᾶ
Греческая строчная буква альфа с периспоменти α
,͂
U+03B1, U+0342 U+1FB7 ᾷ
Греческая строчная буква альфа с периспоменти и ипогеграммены α
,͂
,ι
U+03B1, U+0342, U+03B9 U+1FBC ᾼ
Греческая заглавная буква альфа с просгеграммены α
,ι
U+03B1, U+03B9 U+1FC2 ῂ
Греческая строчная буква эта с вария и ипогеграммены ὴ
,ι
U+1F74, U+03B9 U+1FC3 ῃ
Греческая строчная буква эта с ипогеграммены η
,ι
U+03B7, U+03B9 U+1FC4 ῄ
Греческая строчная буква эта с оксия и ипогеграммены ή
,ι
U+03AE, U+03B9 U+1FC6 ῆ
Греческая строчная буква эта с периспоменти η
,͂
U+03B7, U+0342 U+1FC7 ῇ
Греческая строчная буква эта с периспоменти и ипогеграммены η
,͂
,ι
U+03B7, U+0342, U+03B9 U+1FCC ῌ
Греческая заглавная буква эта с просгеграммены η
,ι
U+03B7, U+03B9 U+1FD2 ῒ
Греческая строчная буква йота с диалитика и вария ι
,̈
,̀
U+03B9, U+0308, U+0300 U+1FD3 ΐ
Греческая строчная буква йота с диалитика и оксия ι
,̈
,́
U+03B9, U+0308, U+0301 U+1FD6 ῖ
Греческая строчная буква йота с периспоменти ι
,͂
U+03B9, U+0342 U+1FD7 ῗ
Греческая строчная буква йота с диалитика и периспоменти ι
,̈
,͂
U+03B9, U+0308, U+0342 U+1FE2 ῢ
Греческая строчная буква ипсилон с диалитика и вария υ
,̈
,̀
U+03C5, U+0308, U+0300 U+1FE3 ΰ
Греческая строчная буква ипсилон с диалитика и оксия υ
,̈
,́
U+03C5, U+0308, U+0301 U+1FE4 ῤ
Греческая строчная буква rho с псили ρ
,̓
U+03C1, U+0313 U+1FE6 ῦ
Греческая строчная буква ипсилон с периспоменти υ
,͂
U+03C5, U+0342 U+1FE7 ῧ
Греческая строчная буква ипсилон с диалитика и периспоменти υ
,̈
,͂
U+03C5, U+0308, U+0342 U+1FF2 ῲ
Греческая строчная буква омега с вария и ипогеграммены ὼ
,ι
U+1F7C, U+03B9 U+1FF3 ῳ
Греческая строчная буква омега с ипогеграммены ω
,ι
U+03C9, U+03B9 U+1FF4 ῴ
Греческая строчная буква омега с оксия и ипогеграммены ώ
,ι
U+03CE, U+03B9 U+1FF6 ῶ
Греческая строчная буква омега с периспоменти ω
,͂
U+03C9, U+0342 U+1FF7 ῷ
Греческая строчная буква омега с периспоменти и ипогеграммены ω
,͂
,ι
U+03C9, U+0342, U+03B9 U+1FFC ῼ
Греческая заглавная буква омега с просгеграммены ω
,ι
U+03C9, U+03B9 U+FB00 ff
Латинская строчная лигатура Ff f
,f
U+0066, U+0066 U+FB01 fi
Латинская строчная лигатура Fi f
,i
U+0066, U+0069 U+FB02 fl
Латинская строчная лигатура Fl f
,l
U+0066, U+006C U+FB03 ffi
Латинская строчная лигатура Ffi f
,f
,i
U+0066, U+0066, U+0069 U+FB04 ffl
Латинская строчная лигатура Ffl f
,f
,l
U+0066, U+0066, U+006C U+FB05 ſt
Латинская строчная лигатура длинная S T s
,t
U+0073, U+0074 U+FB06 st
Латинская строчная лигатура St s
,t
U+0073, U+0074 U+FB13 ﬓ
Армянская строчная лигатура Men Now մ
,ն
U+0574, U+0576 U+FB14 ﬔ
Армянская строчная лигатура Men Ech մ
,ե
U+0574, U+0565 U+FB15 ﬕ
Армянская строчная лигатура Men Ini մ
,ի
U+0574, U+056B U+FB16 ﬖ
Армянская строчная лигатура Vew Now վ
,ն
U+057E, U+0576 U+FB17 ﬗ
Армянская строчная лигатура Men Xeh մ
,խ
U+0574, U+056D Отличные пакеты и библиотеки
- PhantomScript — :ghost: :flashlight: Выполнение невидимого JavaScript и социальная инженерия
- ESReverser — Обращение строка на JavaScript с учётом Юникода.
- mimic — Некорректное использование Юникода
- python-ftfy — Пытается создать максимальную корректное и цельное представление текста, поступившего в Юникоде.
- vim-troll-stopper — Защита вашего кода от юникод-троллей.
Эмодзи
- Диаграмма эмодзи от Консорциума Юникод
- Emojipedia — Информация о конкретном эмодзи, новостной блог.
- emojitracker — Использование эмодзи в реальном времени в Twitter.
- World Translation Foundation — Исследование, продвижение, а также словарь эмодзи.
- Can I Emoji? — Отображает текущее состояние нативной поддержки эмодзи в iOS, Android и Windows.
- Как зарегистрировать доменное имя с эмодзи
Многообразие
Консорциум Unicode приложил огромные усилия для лучшего отражения человеческого многообразия (diversity), включая культурные практики. Вот отчёт Консорциума о многообразии.
Теперь доступны эмодзи для разных гендерных ситуаций, включая однополые семьи, держащиеся руки и поцелуи. Последний функционал — это составные последовательности эмодзи. Основные примеры:
Кодовые точки Рецепт Сочетание 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 Просто выбирайте нужный эмодзи, указав один из модификаторов цвета кожи
u{1F466}u{1F3FE}
.
+
→
Переменные и методы с креативными названиями
Примеры на JavaScript (ES6)
Обычно символы, обозначенные свойством ID_START, можно ставить в начале названия переменной. Символы, обозначенные свойством ID_CONTINUE, можно ставить после первого символа в имени переменной.
// How convenient! var π = Math.PI; // Sometimes, you just have to use the Bad Parts of JavaScript: var ಠ_ಠ = eval; // Code, Y U NO WORK?! var ლ_ಠ益ಠ_ლ = 42; // How about a JavaScript library for functional programming? var λ = function() {}; // Obfuscate boring variable names for great justice var u006Cu006Fu006Cu0077u0061u0074 = 'heh'; // …or just make up random ones var Ꙭൽↈⴱ = 'huh'; // While perfectly valid, this doesn’t work in most browsers: var foou200Cbar = 42; // This is *not* a bitwise left shift (`<<`): var 〱〱 = 2; // This is, though: 〱〱 << 〱〱; // 8 // Give yourself a discount: var price_9̶9̶_89 = 'cheap'; // Fun with Roman numerals var Ⅳ = 4; var Ⅴ = 5; Ⅳ + Ⅴ; // 9 // Cthulhu was here var Hͫ̆̒̐ͣ̊̄ͯ͗͏̵̗̻̰̠̬͝ͅE̴̷̬͎̱̘͇͍̾ͦ͊͒͊̓̓̐_̫̠̱̩̭̤͈̑̎̋ͮͩ̒͑̾͋͘Ç̳͕̯̭̱̲̣̠̜͋̍O̴̦̗̯̹̼ͭ̐ͨ̊̈͘͠M̶̝̠̭̭̤̻͓͑̓̊ͣͤ̎͟͠E̢̞̮̹͍̞̳̣ͣͪ͐̈T̡̯̳̭̜̠͕͌̈́̽̿ͤ̿̅̑Ḧ̱̱̺̰̳̹̘̰́̏ͪ̂̽͂̀͠ = 'Zalgo';
А вот некоторые юникодовские классы CSS от Дэвида Уолша.
<!-- place this within the document head --> <meta charset="UTF-8" /> <!-- error message --> <div class="ಠ_ಠ">You do not have access to this page.</div> <!-- success message --> <div class="">Your changes have been saved successfully!</div>
.ಠ_ಠ { border: 1px solid #f00; } . { background: lightgreen; }
Скрипт рекурсивного переименования тегов HTML
Если вы хотите переименовать все свои HTML-теги в нечто невидимое, вот скрипт, который вам нужен.
Только обратите внимание, что HTML поддерживает не все символы Юникода.
// U+1160 HANGUL JUNGSEONG FILLER transformAllTags('ᅠ'); // An actual HTML element node designed to look like a comment node, using the U+01C3 LATIN LETTER RETROFLEX CLICK // <ǃ-- name="viewport" content="width=device-width"></ǃ--> transformAllTags('ǃ--'); // or even <ᅠ⃝ transformAllTags('u{1160}u{20dd}'); // and for a bonus, all existing tag names will have each character ensquared. h⃞t⃞m⃞l⃞ transformAllTags(); function transformAllTags (newName){ // querySelectorAll doesn't actually return an array. Array.from(document.querySelectorAll('*')) .forEach(function(x){ transformTag(x, newName); }); } function wonky(str){ return str.split('').join('u{20de}') + 'u{20de}'; } function transformTag(tagIdOrElem, tagType){ var elem = (tagIdOrElem instanceof HTMLElement) ? tagIdOrElem : document.getElementById(tagIdOrElem); if(!elem || !(elem instanceof HTMLElement))return; var children = elem.childNodes; var parent = elem.parentNode; var newNode = document.createElement(tagType||wonky(elem.tagName)); for(var a=0;a<elem.attributes.length;a++){ newNode.setAttribute(elem.attributes[a].nodeName, elem.attributes[a].value); } for(var i= 0,clen=children.length;i<clen;i++){ newNode.appendChild(children[0]); //0...always point to the first non-moved element } newNode.style.cssText = elem.style.cssText; parent.replaceChild(newNode,elem); }
Вот что он поддерживает:
function testBegin(str){ try{ eval(`document.createElement( '${str}' );`) return true; } catch(e){ return false; } } function testContinue(str){ try{ eval(`document.createElement( 'a${str}' );`) return true; } catch(e){ return false; } }
А вот некоторые результаты:
// Test if dashes can start an HTML Tag > testBegin('-') < false > testContinue('-') < true > testBegin('ᅠ-') // Prepend dash with U+1160 HANGUL JUNGSEONG FILLER < true
Шрифты Юникода
Ни один шрифт TrueType или OpenType не способен охватить все символы UTF-8, поскольку есть жёсткое ограничение на 65 535 символов в шрифте. Если у нас более 1,1 миллиона глифов UTF-8, то для полного покрытия придётся делать семейство шрифтов.
Дополнительные ресурсы
- «Абсолютный минимум, который каждый разработчик должен обязательно, совершенно точно знать о Юникоде и наборах символов» — Джоэл Спольски
- «Что каждый программист обязательно, совершенно точно должен знать о кодировках и наборах символов для работы с текстом»
- Список рекомендованной литературы от Консорциума Юникод
- Space Yourself — руководство по интервалам от Smashing Magazine
- «У JavaScript проблема Юникода»
- Креативные юзернеймы и захват учётной записи Spotify
Более глубокое исследование самого Юникода
- Shapecatcher — нарисуйте символ, который вы ищете.
- Похожие символы Юникода
- База данных символов Юникода
- Дампы базы Codepoints.net
- Список блоков в пространстве Юникода
- Таблицы символов Юникода
- Таблицы регистров в Юникоде
- Таблица нормализации для Юникода
- FAQ по Юникоду
Общая карта
Карта основной многоязычной плоскости
Каждое нумерованное поле представляет собой 256 кодовых точек.
Китайские, японские и корейские (ККЯ) письменности объединены одним цветом как символы ККЯ (CJK). В процессе, который называется унификацией Хань, распознаются общие символы и составляется список «унифицированных идеограмм ККЯ».
Блоки Юникода
Стандарт Юникод объединяет группы символов в блоки. Вот полный список блоков по всем 17-ти плоскостям.
Принципы Стандарта Юникод
Стандарт Юникод устанавливает следующие фундаментальные принципы:
- Универсальность — каждую когда-либо используемую письменную система следует уважать и представить в стандарте.
- Логический порядок — в двунаправленном тексте символы хранятся в логическом порядке, а не в соответствии с представлением.
- Эффективность — документация должна быть эффективной и полной.
- Унификация — если разные культуры или языки используют один и тот же символ, он должен быть включен только один раз. Это ведёт к следующему пункту.
- Символы, а не глифы — кодируются только символы, а не глифы. В двух словах, глифы являются фактической графической репрезентацией.
- Динамическая композиция — новые символы могут быть составлены из других, уже стандартизированных символов. Например, символ [Ä] может состоять из символа [A] и символа диерезиса [¨].
- Семантика — включённые символы должны быть чётко определены и отличаться от других.
- Стабильность — однажды определённые, символы никогда не будут удалены, а их кодовые точки никогда не будут переназначены. В случае ошибки кодовая точка считается устаревшей.
- Обычный текст — символы в стандарте являются текстом, они никогда не могут быть разметкой или метасимволами.
- Конвертируемость — любая другая используемая кодировка должна иметь возможность быть представленной в терминах кодировки Юникода.
Источник: описание принципов c codepoints.net.
Версии Юникода
- Версия 11.0 (черновик)
- Версия 10.0 (последняя версия, опубликована 20.06.2017 г.)
- Версия 9.0
- Версия 8.0
- Версия 7.0
- Версия 6.3
- Версия 6.2
- Версия 6.1
- Версия 6.0
- Версия 5.2
- Версия 5.1
- Версия 5.0 (недоступна)
- Версия 4.0.1
- Версия 4.0
Автор: m1rko