Здравствуйте, Андрей Якубой.
> Стал замечать, что в текстах встречаются знаки (например, некоторые виды
> знаков ударения) на которые невозможно поставить курсор в NVDA, да и,
> подозреваю, вообще нигде.
Это так называемые комбинируемые символы. Они предназначены не для обозначения какого-то самостоятельного знака, а для модификации предшествующего обычного некомбинируемого символа.
Если написан обычный символ, а затем несколько комбинируемых, то все они как бы напрыгивают на первый некомбинируемый символ слева от них и вместе формируют один знак с точки зрения типографики и навигации по символам.
Предшествие всегда подразумевается слева в байтовом представлении строки. То есть даже для арабских букв комбинируемые символы будут писаться справа по порядку байтов. По крайней мере, пока речь о современном Unicode.
Комбинируемые символы, действительно, обычно представляют собой различные диакритические знаки, но есть и просто всякие штучки, типа изображения колпачка клавиши, чтобы как бы изобразить кнопку и на ней предшествующий некомбинируемый символ.
> Вопрос, как я могу работать с такими символами? Может, есть какая-то
> настройка, которая может хотя бы сообщить о них речью? Я понимаю, что
> далеко не все будут прочитаны синтезатором речи без внесения в словарь,
> но я хотя бы должен знать об их наличие и мочь их выделять, копировать,
> удалять и тд.
С удалением всё просто: надо встать курсором после символа с набором комбинируемых символов, после чего нажимать BackSpace. Так последовательно будут удаляться все комбинируемые символы, а в конце удалиться и сам базовый символ, когда комбинируемых уже не останется.
С остальным основная проблема, действительно, в том, что синтезаторы речи, как правило, просто не умеют называть эти символы, поэтому даже в ситуациях, когда мы обеспечиваем их потенциальную читабельность, синтезатор просто молчит.
В проекте синтезатора Капитан был ряд мероприятий для обеспечения продвинутой обработки этих символов, но пока оно осталось на уровне предварительных исследований и экспериментов. Однако раз даже появился один неаффилированный с Капитаном пользователь, которому это реально надо, то возможно стоит снять этот процесс с паузы, хотя завтра это в любом случае не появится.
В общем пока я могу предложить вам несколько лайфхаков:
Во-первых, можно взять синтезатор речи eSpeak, который многие из комбинируемых символов даже умеет называть их английскими именами, а другие, как минимум, произносить в виде кода символа.
Во-вторых, можно прочитать слово по буквам при помощи соответствующей функции программы экранного доступа, и тогда среди прочего будут произнесены и комбинируемые символы. Вернее, они будут переданы отдельно на синтезатор, а чтение уже будет зависеть от того, насколько он умеет с этим справляться. Не готов сказать, все ли программы экранного доступа обеспечат такой эффект, но JAWS и NVDA точно обеспечат. С NVDA ещё на символе, с которым что-то скомбинировано, можно выполнить команду чтения фонетического описания, и там тоже будет произнесён как базовый символ, так и все символы, которые с ним скомбинированы. Точнее опять же они будут отдельно переданы на синтезатор, а там уж как повезёт.
В-третьих, комбинируемый символ станет фокусируемым и начнёт занимать отдельное место в навигации по символам тогда, когда ему будет не с кем комбинироваться. Добиться этого можно путём постановки комбинируемого символа в начале строки. Если слева от комбинируемого символа будет конец строки, то вы сможете его сфокусировать.
В-четвёртых, JAWS, по сравнению с NVDA, немного более неуклюжий в отношении обработки комбинируемых символов в гипертексте, и этим можно цинично воспользоваться. Если отобразить строку текста с комбинируемыми символами в виртуальном курсоре JAWS, то там все они отобразятся именно как отдельные символы, которые можно будет фокусировать. Как минимум, можно открыть историю речевых сообщений после произнесения текста, и там как раз они отображаются в виртуальном курсоре, так что все комбинируемые символы будут показываться отдельно. Да и можно написать простенький скрипт:
Script ViewSelectedTextInUserBuffer ()
If UserBufferIsActive () Then
UserBufferDeactivate ()
EndIf
SayFormattedMessage (OT_USER_BUFFER, GetSelectedText ())
EndScript
Этот скрипт JAWS хватает выделенный текст и отображает его в окне виртуального просмотра, где все комбинируемые символы будут отдельными фокусируемыми знаками.
Однако в целом вам надо иметь ввиду, что в Unicode есть:
1. Простые буквы. Например, кириллическая буква "и".
2. Комбинируемые символы, которые в сочетании с простыми буквами образуют новые буквы. Например, символ breve, который выглядит как маленькая подковка рогами вверх, впрыгивающая сверху на предшествующий некомбинируемый символ. Если написать букву "и", а затем breve, то получится буква "й".
3. Так называемые предварительно составленные символы. Например, отдельный символ для буквы "й".
Разумеется, предварительно составленные символы в Unicode есть далеко не для всех вариантов сочетания обычного символа с комбинируемым, а только для самых ходовых.
Однако идея в том, что "и" с последующим breve и просто отдельная "й" - это одно и тоже с точки зрения типографики.
Более того, по-хорошему даже при поиске в текстовом редакторе по запросу "й" должны находиться в том числе и варианты этой буквы, написанные через "и" с breve. Процесс приравнивания двух вариантов написания одной и той же буквы друг к другу называется нормализацией Unicode. Все системы работы с текстом в принципе должны поддерживать нормализацию Unicode. В том числе и синтезаторы речи "и" с breve вообще-то должны читать как "й", а не неуклюже спотыкаться, как сейчас происходит практически у всех.
Ну а с точки зрения трансляционных таблиц литературного брайля возникает пространство для дискуссии: надо ли отображать "и" с breve как два знака или же надо отображать как "й".
С одной стороны для редактирования текста возможно удобнее отображать как два знака, чтобы редактор понимал разницу, с другой, именно типографский смысл в том, что в этом месте написана буква "й".
Успехов. Никита.