Символы Юникода не объединены должным образом

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

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

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

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

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

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

1 ответ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам