Шрифт Брайля в стандарте Unicode

Дата публикации:15.03.2012
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

Что такое рельефно-точечный шрифт Брайля, знает подавляющее большинство незрячих, и если не практически, то хотя бы теоретически. Однако мало кому известно, что брайлевский текст можно написать не только на бумаге, но и на экране компьютера. Например, вот так выглядит слово "Тифлокомп", написанное по-брайлю:

⠘⠞⠊⠋⠇⠕⠅⠕⠍⠏

В этой статье будет рассказано о том, как это сделать, а также о том, как запрограммировать импровизированную брайлевскую "печатную машинку" на VBScript.

Нетерпеливые читатели могут сразу перейти к практической части статьи, пропустив начальную теорию.

Как это работает

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

Таким образом, согласно правилам комбинаторики, число всех возможных конфигураций шеститочия составляет 26 = 64, а восьмиточия - 28 = 256.

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

Разработчики стандарта кодирования символов UNicode 6.0 уделили внимание в том числе и знакам Брайля, выделив под них кодовое пространство под названием "Braille Patterns" в диапазоне от U+2800 до U+28FF, что в десятичных кодах означает от 10240 до 10295, и таким образом набор состоит из требуемых двухсот пятидесяти шести символов.

Особо следует отметить тот факт, что глифы брайлевских знаков сортируются согласно бинарному инкременту, а не алфавитному порядку, так как знаки могут принимать разное значение в зависимости от конкретного языка, да и могут иметь вообще неалфавитный смысл, например, цифровой знак или знак курсивного начертания.

В этом заключается очень важный момент понимания принципов построения кодов брайлевских символов, так как надо отказаться от привычных компьютерных категорий "буква = код", а рассуждать так, как бы мы это делали, выкалывая точки на приборе.

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

Как известно, точки в брайлевской ячейке имеют свои номера. В режиме письма в приборе:

  • 1 - правая верхняя
  • 2 - правая средняя
  • 3 - правая нижняя
  • 4 - левая верхняя
  • 5 - левая средняя
  • 6 - левая нижняя

В режиме чтения нумерация отображается зеркально по вертикальной оси:

  • 1 - левая верхняя
  • 2 - левая средняя
  • 3 - левая нижняя
  • 4 - правая верхняя
  • 5 - правая средняя
  • 6 - правая нижняя

Существует альтернативная версия нумерации, где точки 1 и 3 переставлены местами. Этот вариант продвигался, главным образом, некоторыми советскими тифлопедагогами. Однако подобная нумерация противоречит международным традициям Брайля и при использовании в рамках алгоритмов, описанных в данной статье, приведёт к некорректным результатам.

Две дополнительные точки появились позднее, поэтому их нумерация несколько выбивается из общего ряда:

  • 7 - дополнительная точка под точкой 3
  • 8 - дополнительная точка под точкой 6

Как отмечалось ранее, любая из точек имеет два состояния. В компьютерной интерпретации Брайля плоскую точку следует воспринимать как 0, а выпуклую как 1.

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

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

Особо следует обратить внимание на то, что точки надо записывать в обратном порядке, то есть в начале строки должна стоять точка 8, а в конце - точка 1, чтобы получилось именно двоичное число.

Например, буква "t" пишется точками 2, 3, 4 и 5. Это означает, что данные точки будут иметь значение 1, а оставшиеся точки 1, 6, 7 и 8 будут иметь значение 0.

Теперь следует записать значения всех восьми точек подряд, начиная с точки 8 и заканчивая точкой 1, то есть

00011110

Далее полученное двоичное число следует перевести либо в десятичную, либо в шестнадцатеричную систему исчисления, что даст 30 и 1E соответственно.

После этого, данное число следует прибавить к нижней границе диапазона Braille Patterns, то есть

  • 10240 + 30 = 10270
  • 2800 + 1E = 281E

Полученное в итоге число и будет являться кодом соответствующего брайлевского знака в системе Unicode 6.0. Причём знак U+281E является брайлевским аналогом не только латинской буквы "t" (U+0074), но и кириллической "т" (U+0442), а также, например, ещё и половинной ноты си, подтверждая то, что было сказано ранее о неоднозначности знаков Брайля.

Автоматизация процесса

Позабыты хлопоты,
Остановлен бег,
Вкалывают роботы,
А не человек.

[© Ю. С. Энтин]

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

Ниже будет показан пример кода на языке программирования Visual Basic Scripting Edition, который будет выполнять все расчёты автоматически. Любой желающий может записать код в обычный текстовый файл с расширением .vbs и запускать его практически на любой современной версии OS Windows без установки каких-то дополнительных интерпретаторов.

Сначала рассмотрим простой вариант скрипта, который будет запрашивать номера точек и на их основе генерировать брайлевский Unicode-символ вместе с его шестнадцатеричным кодом. Из соображений упрощения кода пропустим некоторые моменты проверки введённых данных. Некорректная информация скриптом будет просто игнорироваться.

' Задаём начальное значение каждой брайлевской точки
Dot1 = 0
Dot2 = 0
Dot3 = 0
Dot4 = 0
Dot5 = 0
Dot6 = 0
Dot7 = 0
Dot8 = 0
' Запрашиваем у пользователя номера брайлевских точек
BrailleDots = InputBox("Введите номера брайлевских точек: ")
' Проверяем отметку пользователем каждой точки
If InStr (BrailleDots, "1") <> 0 Then Dot1 = 1
If InStr (BrailleDots, "2") <> 0 Then Dot2 = 1
If InStr (BrailleDots, "3") <> 0 Then Dot3 = 1
If InStr (BrailleDots, "4") <> 0 Then Dot4 = 1
If InStr (BrailleDots, "5") <> 0 Then Dot5 = 1
If InStr (BrailleDots, "6") <> 0 Then Dot6 = 1
If InStr (BrailleDots, "7") <> 0 Then Dot7 = 1
If InStr (BrailleDots, "8") <> 0 Then Dot8 = 1
' Перечисляя значение точек в обратном порядке получаем двоичный код брайлевского символа,
' который тут же переводим в десятичную систему по известному правилу
BrailleCharacterCode = Dot8*2^7 + Dot7*2^6 + Dot6*2^5 + Dot5*2^4 + Dot4*2^3 + Dot3*2^2 + Dot2*2^1 + Dot1*2^0
' Прибавляя к началу диапазона Braille Patterns код из строки выше,
' получаем код символа из таблицы Unicode
BrailleCharacter = 10240 + BrailleCharacterCode
' Конвертируем получившийся десятичный код в шестнадцатеричное значение, используемое в обозначении Unicode
BrailleCharacterUnicode = Hex(BrailleCharacter)
' Выводим в сообщении соответствующий символ Брайля и его числовое значение Unicode
MsgBox ChrW (BrailleCharacter) & " — U+" & BrailleCharacterUnicode

Написанный скрипт способен сгенерировать один брайлевский символ, согласно наличию во введённой строке цифр от 1 до 8, обозначающих выпуклые точки. Порядок цифр, их повтор и наличие посторонней информации не имеет значения.

Тем не менее, данная программа представляет скорей академический интерес, так как набирать даже короткую фразу по одному символу довольно неудобно.

Поэтому следующий скрипт будет предназначен именно для практического использования.

Пользователь сможет через пробел ввести несколько групп цифр, которые будут восприниматься как отдельные брайлевские ячейки. Для ввода пробела также можно будет либо набирать 0, либо двойной пробел. Как и в предыдущем варианте, порядок цифр, их повтор и наличие посторонней информации в группах, разделённых пробелами, значения не имеет.

' Создаём пустое восьмиточие
Call CleaningCell
' Создаём пустую строку брайлевского текста
BrailleString = ""
' Запрашиваем у пользователя строку брайлевских символов
SourceString = InputBox("Введите через пробел номера точек брайлевских символов: ")
' Расставляем в строке пробелы
ConvertedString = Replace (SourceString, " ", " 0 ")
' Разбиваем строку на массив знаков
CharacterArray = Split (ConvertedString)
' Цикл посимвольной обработки строки
For NumberCharacter = 0 To UBound (CharacterArray)
' Получаем брайлевский Unicode-символ
BrailleCharacter = Cell (CharacterArray(NumberCharacter))
' Приписываем к концу строки брайлевского текста символ
BrailleString = BrailleString & BrailleCharacter
Next
' Выводим брайлевский текст
MsgBox "Брайль" & Chr (13) & BrailleString
' Подпроцедура создания/очистки восьмиточия
Sub CleaningCell ()
Dot1 = 0
Dot2 = 0
Dot3 = 0
Dot4 = 0
Dot5 = 0
Dot6 = 0
Dot7 = 0
Dot8 = 0
End Sub
' Функция генерации брайлевского символа
Function Cell (Character)
' Получаем десятичный код брайлевского символа внутри Braille Patterns
If Character = "0" Then
BrailleCharacterCode = 0
Else
If InStr (Character, "1") <> 0 Then Dot1 = 1
If InStr (Character, "2") <> 0 Then Dot2 = 1
If InStr (Character, "3") <> 0 Then Dot3 = 1
If InStr (Character, "4") <> 0 Then Dot4 = 1
If InStr (Character, "5") <> 0 Then Dot5 = 1
If InStr (Character, "6") <> 0 Then Dot6 = 1
If InStr (Character, "7") <> 0 Then Dot7 = 1
If InStr (Character, "8") <> 0 Then Dot8 = 1
BrailleCharacterCode = Dot8*2^7 + Dot7*2^6 + Dot6*2^5 + Dot5*2^4 + Dot4*2^3 + Dot3*2^2 + Dot2*2^1 + Dot1*2^0
End If
' Очищаем восьмиточие
Call CleaningCell
' Возвращаем брайлевский Unicode-символ
Cell = ChrW (10240 + BrailleCharacterCode)
End Function

Теперь любой желающий может послать своим знакомым сообщение электронной почты или tweet, написанный по-брайлю, а также, например, указать название своего сайта в том числе и рельефно-точечным шрифтом.

Ложка дёгтя напоследок

К сожалению, нередка ситуация, когда символы из пространства Braille Patterns отсутствуют в используемом шрифте. Кроме того, и отдельные программы даже при наличии шрифта, поддерживающего широкий диапазон Unicode, например, Arial Unicode MS, Code2000, Lucida Sans Unicode и другого, всё равно могут отображать на месте таких символов прямоугольники, вопросительные знаки и прочие бессмысленные символы. В частности эта проблема достаточно распространена среди браузеров.

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

Таким образом, если планируется использовать брайлевские Unicode-символы в каких-то серьёзных проектах, например, презентациях, научных работах и тому подобное, то имеет смысл учитывать вероятность возникновения проблем подобного рода и возможно прибегать к более надёжным методам, например, к внедрению screenshot'а с системы, где отображение осуществляется корректно.



Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024