Unicode
Говоря о таблице символов, нельзя обойти вниманием Unicode - стандарт кодирования символов. Стандарт позволяет кодировать примерно 1.1 миллион кодовых позиций, что хватает для символов большинства языков мира, пиктограмм, математических, научных, музыкальных символов и т.п. Обычно код Unicode записывается в шестнадцатеричном виде U+XXXX, U+XXXXX или U+XXXXXX. Все кодовое пространство разделено на плоскости по 65536 кодов в каждой. На сегодняшний день используются или зарезервированы плоскости с номерами 0,1,2,3,14,15,16. В каждой плоскости выделены блоки для групп символов, например в плоскости 0: Основная латиница, Кириллица, Математические операторы. Как правило, шрифт, установленный в системе, содержит изображения символов из нескольких (но не всех!) блоков одной или нескольких плоскостей. Иногда система, не находя изображение символа с заданным кодом в заданном шрифте, может подобрать символ из другого шрифта. Поскольку в 1С, в основном, применяется UTF-16, то напрямую можно использовать только 65536 кодовых позиций из 0 плоскости. Кодовые позиции из других плоскостей, т.е. U+1XXXX, U+2XXXX..., необходимо представить в виде двух последовательных кодов, суррогатной пары. Подробнее об этом описано в статье 1С и Unicode. Преобразование в суррогатную пару может выглядеть, например, так:
Результат.Вставить("Код1", Цел((Код - 65536) / 1024) + 55296);
Результат.Вставить("Код2", (Код - 65536)%1024 + 56320);
Рендер шрифта в конкретной программе понимает (вернее, должен понимать))), что из двух последовательных кодов, суррогатной пары, надо получить один символ, найти его изображение в файле шрифта и отобразить на экране.
Таблица символов
С теорией покончено, переходим к практике. Для просмотра символов шрифта был создан специальный инструмент, приложенный к публикации.
Основные функциональные возможности:
- Отображение таблицы символов выбранного шрифта. Диапазон символов задается плоскостью и диапазоном кодов внутри плоскости. Диапазон кодов можно задавать вручную в десяти- и шестнадцатеричном виде, а также с помощью выбора предопределенного блока. Список предопределенных блоков содержит более 300 элементов.
- Выделенный в таблице символ отображается справа в укрупненном виде, с указанием его кода. Кодом этого символа можно управлять (изменять) вручную для быстрого просмотра.
- Под таблицей символов расположено поле ввода произвольной строки. Введенная строка символов дублируется в декорации-надписи и в ячейке табличного документа с применением выбранного шрифта.
- Строку символов можно "накликивать" по таблице, т.е. выбранный в таблице символ добавляется или вставляется в строку.
- Строка символов разбирается на коды символов, которые помещаются в таблицу. Возможен обратный процесс - ввод кодов в таблицу и формирование строки символов.
Символы с кодами, большими 65535, преобразуются в суррогатные пары:
Здесь символ U+1F47B разбивается на два: D83D и DC7B. Обратите внимание: символ выглядит как один, но строка содержит два символа! Это приводит к проблеме подсчета количества символов, сравнения строк, получения подстрок, даже перевернуть строку становится очень сложной задачей.
Суррогатные пары - это не единственная особенность Unicode. Существуют специальные символы, которые могут влиять на поведение других символов - объединять или разделять символы, менять направление текста и т.д.
Так, например, символы U+202E и U+202D меняют направление текста в поле ввода:
В строке "0123456789" после "3" и после "7" поменялось направление и в поле ввода отображается "0123897654". На картинке я перемещаю курсор только с помощью стрелки "вправо" на клавиатуре, а курсор "прыгает" в разные части строки, конец строки для него - между видимыми цифрами "9" и "7".
При написании данного инструмента я неожиданно столкнулся с одной неприятной проблемой. Все знают, что при клиент-серверном взаимодействии между клиентом и сервером передается сериализованный контекст формы. Так вот, при наличии в реквизитах формы некоторых символов Unicode появляется ошибка подобного вида:
Чтобы избежать появления подобных ошибок, недостаточно заменить контекстные вызовы на внеконтекстные, так как неявные серверные вызовы происходят, например, при установке шрифта или при завершении работы. Пришлось везде, где возможно обращение к серверу, очищать потенциально опасные реквизиты.
Так что же содержится в шрифте?
Давайте теперь посмотрим, что можно получить, используя самый обычный шрифт 1С "Шрифт диалогов и меню".
Все нижеследующие эксперименты были проведены в тонком клиенте 8.3.22.1709, со стандартными шрифтами Windows 11 Домашняя (Версия 22H2)
Итак, начнем.
- Блоки с латиницей нам не дают ничего интересного, разве что там можно увидеть сдвоенные буквы одним символом:
- Блок с модификаторами букв тоже не содержит ничего любопытного, а вот на комбинируемых диакритических знаках надо остановиться подробнее.
На экране вовсе не русская буква Й, а два символа: буква И и символ COMBINING BREVE. Используя подобные комбинации, а также похожие на кириллические символы из других блоков, можно писать тексты, в которых не будет работать поиск. Не зря для текстов модулей это запрещено стандартами 1С.
Можно комбинировать несколько знаков:
Само собой, наличие подобных комбинаций может доставить много веселых минут часов разработчику при работе с такими строками.
- Кириллица:
Символы кириллицы располагаются по алфавиту. Все кроме Ё и ё. Это означает что: а) нельзя сортировать строки используя простое сравнение кодов символов и б) строчная буква из прописной получается простым увеличением кода символа на 20h для всех, кроме буквы Ё.
Далее следует
- много блоков национальных языков: армянский, еврейский, арабский, языки южной азии, африки, индейские, иероглифы ККЯ (Китай, Корея, Япония) и их части, и другие системы письма.
Многие языки (например арабский) рассчитаны на массовое использование комбинированных знаков - к обычным буквам добавляются штрихи, черточки и т.п.
Среди символов встречаются очень необычные и красивые:
- Надстрочные и подстрочные знаки:
- Знаки валют:
- Числовые формы:
- Стрелки:
- Математические операторы:
- Обрамлённые буквы и цифры:
- Псевдографика:
- Геометрические фигуры:
- Разные символы, в том числе офисные, религиозные, знаки зодиака, шахматные фигуры и т.п.:
- Шрифт Брайля:
- Обозначение технических и научных величин (может пригодиться для справочника ЕдиницыИзмерения. Только для печати, конечно же))
- Музыкальные символы:
- Символы «Канона великого сокровенного» (я не знаю, что это такое...)
- Кости для маджонга:
- Кости для домино:
- Игральные карты:
Символы последних трех блоков, а также символы шахматных фигур вполне могут быть использованы при написании игр, в том числе на 1С))
Еще раз подчеркну, в разных шрифтах находятся разные наборы символов. Например, в стандартных шрифтах Windows 7 части вышеупомянутых символов просто нет.
Эмодзи
Эмодзи - это целая технология в рамках Unicode. Представляют собой цветные или монохромные картинки. Содержатся в шрифтах: Windows - Segoe UI Emoji, Android - Noto Color Emoji, macOS/iOS - Apple Color Emoji. Для формирования картинки требуют специального рендера. Далеко не все программы обеспечивают полноценное отображение всех разновидностей эмодзи. Рендер 1С поддерживает не так уж много возможностей и делает это странно: часть эмодзи вообще не поддерживаются, часть не видна в полях ввода и декорациях, но видна в табличном документе, а часть поддерживается только в ячейке табличного документа в процессе редактирования ячейки (sic!). Так что эти строки я пишу с прицелом на будущие версии платформы. 1С поддерживает только монохромные эмодзи, для просмотра цветных вариантов буду использовать программу BabelPad. Кстати, рекомендую для просмотра шрифтов программу BabelMap того же производителя.
Эмодзи, в основном, расположены в блоках плоскости 1: "1F300-1F5FF Разные символы и пиктограммы (Miscellaneous Symbols and Pictographs)" и "1F900-1F9FF Дополнительные символы и пиктограммы (Supplemental Symbols and Pictographs)". Как утверждает документация, эмодзи можно получить из символов блока "2600-26FF Разные символы (Miscellaneous Symbols)" и "2700-27BF Dingbats (Dingbats)" с помощью дополнительного символа U+FE0F VARIATION SELECTOR-16 (VS16), но у меня не получилось заметить хоть какого-то влияния этого модификатора на внешний вид.
Чем же примечательны эмодзи? Тем, что комбинируя несколько эмодзи с использованием объединяющих символов и модификаторов можно получить новый символ.
Например:
Белый (полярный) мишка U+1F43B U+200D U+2744
Черный кот U+1F408 U+200D U+2B1B
Пиратский флаг U+1F3F4 U+200D U+2620
Рукопожатие U+1FAF1 U+200D U+1FAF2
Профессии:
Космонавт U+1F468 U+200D U+1F680
Художница U+1F469 U+200D U+1F3A8
Фермер U+1F468 U+200D U+1F33E
Повар U+1F469 U+200D U+1F373
В этих примерах используется объединяющий символ U+200D - ZERO WIDTH JOINER (ZWJ)
Эти же эмодзи в цветном варианте выглядят так:
У эмодзи можно модифицировать цвет кожи (U+1F3FB - U+1F3FF), пол (U+2640, U+2642), прическу (U+1F9B0 - U+1F9B3).
Примеры:
Межрасовое рукопожатие U+1FAF1 U+1F3FF U+200D U+1FAF2 U+1F3FB
Скалолаз U+1F9D7
Скалолазка U+1F9D7 U+200D U+2640
Темнокожая скалолазка U+1F9D7 U+1F3FF U+200D U+2640
Бородатый мужчина U+1F9D4 U+200D U+2642
Кудрявая блондинка U+1F469 U+1F3FC U+200D U+1F9B1
Лысый негр U+1F9D1 U+1F3FF U+200D U+1F9B2
Много эмодзи, посвященных семейным отношениям:
U+1F469 U+200D U+1F91D U+200D U+1F468
U+1F469 U+200D U+2764 U+200D U+1F468
U+1F469 U+200D U+2764 U+200D U+1F48B U+200D U+1F468
U+1F470 U+200D U+2640
U+1F469 U+200D U+1F37C
U+1F468 U+200D U+1F469 U+200D U+1F466
U+1F468 U+200D U+1F469 U+200D U+1F467 U+200D U+1F466
Такие эмодзи тоже можно модифицировать с помощью оттенков кожи и, гм, пола.
В 1С это тоже частично работает, только изображение монохромное:
Целый класс эмодзи, к сожалению, не работает в Windows: флаги стран, составленные из букв “regional indicator symbol letter” (U+1F1E6 - 1F1FF). "RU" должен был бы превратиться во флаг России. Также не работают флаги Британского Содружества: U+1F3F4 U+E0067 U+E0062 U+E0073 U+E0063 U+E0074 U+E007F - это флаг Шотландии.
Зато работают эмодзи Keycaps:
'1' + U+20E3
Вместо первого символа можно использовать цифры, и символы '#' и '*'. Видимо, они сделаны для обозначения кнопок телефона. Кстати, это единственный вид составного эмодзи, который правильно отображается и в декорации, и в табличном документе 1С.
В заключение осталось отметить:
- Программистам 1С надо иметь в виду, что современные тексты могут содержать последовательности символов, которые нельзя разрывать. Это необходимо учитывать при поиске в строке и при модификации строк.
- Нестандартные символы можно вводить с помощью набора десятичного кода на цифровой клавиатуре при нажатой кнопке Alt
- Все больше программ поддерживают эмодзи: MS Word - большое их количество, MS Excel - чуть меньше.
- Надеюсь что рендер платформы 1С в скором времени улучшит поддержку эмодзи.
Полезные ссылки:
- Юникод
- Блок Юникода
- Этот восхитительный Юникод
- Комбинируемые диакритические знаки
- Под капотом у Emoji
- Full Emoji List, v15.0
- Recommended Emoji ZWJ Sequences, v15.0
Напомню, что тесты проводились в тонком клиенте 8.3.22.1709, со стандартными шрифтами Windows 11 Домашняя (Версия 22H2). На других платформах и ОС результаты могут быть иными.
Как всегда, приветствуются замечания / дополнения / комментарии.