Символы Юникода не объединены должным образом - PullRequest
0 голосов
/ 06 декабря 2018

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

Проблема возникает каждый раз, когда базовый символ комбинируется с знаком стресса Деванагари Udatta ॑ (U+0951) и Знак Деванагари Вишарга ः (U+0903).

Примером этого может быть र॑ः, то есть र (U+0930) + + , и его следует отобразитькак один персонаж.Но знак напряжения и другой, похоже, не нравятся друг другу (как вы можете видеть выше!).
Нет проблем объединить базовый символ с каждым из двух других одних только знаков, кстати: र॑/ रः

Я уже пытался использовать несколько шрифтов, которые должны уметь отображать символы деванагари (некоторые шрифты Noto, Siddhanta, GentiumPlus) и тестировать их в разных браузерах, но проблема, похоже, в другом.

У кого-нибудь есть идея?Разве это не допустимая комбинация символов?

РЕДАКТИРОВАТЬ: Я просто попытался переключиться между двумя метками, просто чтобы посмотреть, что если - он отображается как रः॑, поэтому U+0951 и U+0903 неПохоже, у него та же функция, так как знак напряжения отображается поверх другой метки.
Похоже, я еще недостаточно понимаю Unicode.

1 Ответ

0 голосов
/ 27 декабря 2018

Это НЕ решение вашей проблемы, но может быть полезной информацией:

Я работаю с некоторыми текстовыми данными деванагари, которые я хочу отобразить в браузере.

Как и вы, я не смог заставить это работать ни в одном браузере, несмотря на попытку использовать несколько шрифтов, включая Arial Unicode MS :

browserDevanagari

Браузер просто отображал текст Devanagari Test: &#x0930;&#x0903;&#x0951; из <body> JSP.Знак напряжения явно появляется над знаком Visarga вместо базового символа.

Разве это недопустимая комбинация символов?

Itявляется действительной комбинацией.Я не знаю Деванагари, поэтому я не знаю, является ли он семантически «допустимым», но тривиально сгенерировать именно тот символ, который вам нужен из приложения Java:

System.out.println("Devanagari test: \u0930\u0903\u0951");

Это результат выполнения вызова println(), показывающий знак напряжения над базовым символом:

devanagara1

Приведенный выше снимок экрана взят из NetBeans8.2 в Windows 10, но рендеринг также работал нормально с использованием последних версий Eclipse и Intellij IDEA.Ограничения:

  • Три символа должны быть указаны в этом порядке в println() для рендеринга для работы.
  • Знак Visarga и Знак стресса Удатта должна быть представлена ​​в форме Юникода.Вставка их представлений глифов в исходный код не будет работать, хотя это можно сделать для базового символа.
  • Для отображения должен использоваться соответствующий шрифт.Я использовал Arial Unicode MS для снимка экрана выше, но другие шрифты, такие как Serif , SansSerif и Monospaced также работали.

У кого-нибудь есть идея?

К сожалению, нет, хотя очевидно, что:

  • Графема, которую вы хотите визуализировать, существуети действителен.
  • Хотя он не отображается в браузере, он может быть записан на консоль приложением Java.
  • Проблема, как представляется, заключается в том, что все браузеры применяют диакритический знак( Знак стресса Udatta ) на непосредственно предшествующий символ, а не на базовый символ.

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

...