Как получить доступ к начальной форме арабского BEH из шрифта, который помещает глиф в нетрадиционное место в слоте Unicode

(Я новичок как в арабском языке, так и в работе с Unicode, поэтому, возможно, я упускаю из виду некоторые бросающиеся в глаза детали.)

Итак, я использую шрифт SIL Lateef и хочу получить доступ к глифу начальной формы BEH в HTML. (Поскольку в MSA «с/через» переводится как префикс ﺑِ, поэтому я хочу включить его в исходную форму, чтобы было понятно, что это префикс, а не слово само по себе.)

Глиф начальной формы BEH имеет код Unicode U+FE91 . Однако Латиф не включает глиф в этом «местоположении» (не совсем уверен, как его назвать), а вместо этого включает глиф в U + 1016F («Греческий акрофонический каристиан Пятьсот»), а затем использует таблицу подстановки для использования это. (Использование таблицы замещения логично, но я не понимаю, почему Lateef помещает глиф в это странное место.)

Поскольку мое приложение определенно использует Lateef, включенный в качестве веб-шрифта, я решил просто сослаться на него как U+1016F в javascript ( ) \u{1016F}или HTML ( 𐅯или 𐅯) --- я знаю, что это некрасиво, потому что это не семантика, но я не мог выбрать лучший способ. Однако, несмотря на то, что рассматриваемый элемент действительно использовал Lateef в качестве шрифта, Chrome вместо этого отображал «Греческий акрофонный каристийский пятьсот»:

Это не глиф начальной формы BEH!

Тогда мои вопросы:

  • Почему Chrome отображает глиф «Греческий акрофонический каристиан пятьсот», когда элемент HTML явно использует Lateef, и символ Unicode указан правильно, а Lateef действительно включает глиф начальной формы BEH в U + 1016F?
  • Возможно ли вообще отобразить начальный BEH Латифа? (Кроме редактирования шрифта, чтобы включить глиф в правильном месте.)
  • Является ли это ошибкой/недоразумением с моей стороны или настоящей странностью со стороны Chrome, Ubuntu/Chrome, Unicode или HTML?
Можете ли вы проверить элемент в Chrome, чтобы проверить, действительно ли он использует Lateef или резервный шрифт для отображения этого конкретного глифа? Возможно, в таблице подстановок есть что-то, из-за чего Chrome считает, что Lateef на самом деле не включает кодовую точку U+1016F. И да, очень странное место для его размещения — совсем не похоже на SIL, я бы подумал.
Проверка элемента в Chrome, чтобы убедиться, что указан Lateef: i.imgur.com/yN26bvG.png . Но я действительно не знаю, как браузеры работают со шрифтами, может быть, это действительно так, что Chrome по какой-то причине просто не знает/думает, что у Lateef есть символ, и поэтому использует другой шрифт? Что-то в этой форме в основном должно иметь место, я думаю..
Попробуйте прокрутить вниз до нижней правой части инструментов разработчика (та, где есть модель графического блока). В самом низу указывается, какой шрифт фактически отображается; вот пример со случайного сайта. Это должно дать вам реальный отображаемый шрифт, а не правило CSS, которое может повлечь за собой использование резервных шрифтов, в данном случае «serif».
Ах, отлично. Я не знал, чтобы найти эту информацию раньше. Он действительно возвращается к другому шрифту (Symbola). Но мне интересно, почему, поскольку глиф действительно присутствует в Lateef. Может быть, это как-то связано с тем, как работает Unicode, и он запрещает прямое использование глифа?
Я так не думаю, потому что он правильно отображает глиф. Должно быть что-то с Латифом. У вас случайно нет InDesign? Если вы это сделаете, попробуйте настроить стиль абзаца, в котором в качестве шрифта используется Lateef, скопируйте глиф из браузера в неформатированный текстовый редактор (Блокнот или аналогичный), а затем вставьте его в InDesign с этим стилем абзаца. Если он также появится в виде квадрата или чего-то подобного, то вы точно будете знать, что это что-то с Латифом.
У меня нет InDesign, поэтому я не мог проверить это. Однако я сделал интересное открытие, поигравшись с FontForge: в меню «Вид» > «Подписать глиф по...» я выбрал «Юникод» вместо «Изображение глифа», и вдруг я заметил, что в некоторых технический смысл, о котором я больше не знаю, гильф, хотя и «расположенный» по адресу 0x1016f, не был «назначен» точке юникода U + 1016f. Итак, я назначил его сам (установив «Информация о глифах»> «Unicode»> «Значение Unicode» на «U + 1016f»), и теперь доступ работает. Так что да, вы правы, это дело Lateef в (не) присвоении этих значений Unicode...
Рад видеть, что вы нашли ошибку — и это действительно похоже на ошибку. Вы должны опубликовать это как ответ на вопрос; затем вы можете принять его, чтобы показать, что на вопрос был дан ответ, и убрать его из списка «вопросов без ответов». Я бы также предложил связаться с SIL и сообщить им об этой странности. Это не похоже на что-то действительно преднамеренное.
На самом деле, при ближайшем рассмотрении, возможно, это не совсем ошибка. Кодовая точка U+FE91 находится в блоке арабских презентационных форм B , которые, согласно стандарту Unicode (стр. 255–256), не должны использоваться сами по себе: «Эти глифы обычно недоступны как символы и используется только движками рендеринга». Так что, возможно, глиф не сопоставляется с точкой Unicode намеренно. Тем не менее кажется глупым включать глиф, но не отображать его.
Мне действительно кажется глупым. Читатель, у которого я изучаю MSA в этом курсе, за которым я следую, включает начальную форму в словарь, чтобы указать, что это префикс, как я уже упоминал в вопросе. Такое использование, хотя, возможно, и неортодоксальное, тем не менее является семантическим и, следовательно, должно быть возможным. Фактически, это рассуждение применимо к любому глифу, и Unicode действительно представляет эти PDF-файлы со всеми возможными глифами, верно? Ну что ж. Я нашел интересное исправление, кстати, как вы можете прочитать в ответе;) И спасибо за помощь!

Ответы (1)

Причина, по которой глиф был недоступен

По-видимому, хотя глиф начальной формы BEH был «сохранен» по адресу 0x1016f, ему не было «назначено» значение Unicode U+1016f. Насколько я понимаю, в этом случае глиф не будет отображаться в cmapтаблице, которая является основным местом для процесса выбора символа механизма рендеринга -> процесса выбора глифа.

Я обнаружил это, когда возился с Fontforge. В FontForge, чтобы просмотреть символы, помеченные значением Unicode, вместо изображения глифа, выберите «Просмотр» > «Пометить глиф по» > «Unicode»; и чтобы установить значение Unicode для рассматриваемого глифа, выберите глиф, щелкните правой кнопкой мыши, затем установите «Информация о глифе ...»> «Unicode»> «Значение Unicode» соответствующим образом.

Я предполагаю, что это ошибка шрифта Lateef; «правильным» способом было бы сделать глиф доступным в таблице cmap, но также поместить его в 0xfe91 в первую очередь вместо 0x1016f (где он семантически не принадлежит).

Как получить доступ к глифу в любом случае

ЛЕГКО: просто используйте U+0640 : بـ.

СТАРЫЙ/СЛОЖНЫЙ:

Помимо изменения шрифта, как следует из решения проблемы выше, я придумал еще один необычный способ доступа к глифу без изменения шрифта.

<div style="direction: rtl;">ب&zwj;<span style="color:#fff; width: 0px; display: inline-block;">ن</span></div>

Поскольку к глифу можно получить неявный доступ, в сочетании с последующими буквами можно просто скрыть эти последующие буквы и в итоге получить только глиф начальной формы BEH. Однако необходимо использовать дополнительный трюк: добавить соединение нулевой ширины &zwj;, чтобы символы могли соединяться через вкрапленный <span>элемент.