Символы Юникода не объединены должным образом
Я работаю с некоторыми текстовыми данными деванагари, которые я хочу отобразить в браузере. К сожалению, есть одна комбинация непересекающихся комбинирующих символов, которые не отображаются как неправильно комбинированные символы.
Проблема возникает каждый раз, когда базовый персонаж сочетается со знаком стресса Деванагари. ॑ (U+0951)
и знак Деванагари Вишарга ः (U+0903)
,
Примером этого может быть र॑ः
, который र (U+0930)
+ ॑
+ ः
и должен быть представлен как один символ. Но знак стресса и другой, похоже, не нравятся друг другу (как вы можете видеть выше!).
Это не проблема, чтобы объединить базовый символ с каждым из двух других знаков, кстати: र॑
/ रः
Я уже пытался использовать несколько шрифтов, которые должны уметь отображать символы деванагари (некоторые шрифты Noto, Siddhanta, GentiumPlus), и тестировал их в разных браузерах, но проблема, похоже, в другом.
У кого-нибудь есть идея? Разве это не допустимая комбинация символов?
РЕДАКТИРОВАТЬ: я просто попытался переключиться между двумя отметками, просто чтобы увидеть, что, если - это отображается как रः॑
, так U+0951
а также U+0903
Похоже, что они не выполняют ту же функцию, так как знак напряжения отображается поверх другой отметки.
Похоже, я еще недостаточно понимаю Unicode.
1 ответ
Это НЕ решение вашей проблемы, но может быть полезной информацией:
Я работаю с некоторыми текстовыми данными деванагари, которые я хочу отобразить в браузере.
Как и вы, я не смог заставить это работать в любом браузере, несмотря на то, что попробовал несколько шрифтов, включая Arial Unicode MS:
Браузер просто рендерил текст Devanagari Test: रः॑
изнутри <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.
- Кажется, проблема в том, что все браузеры применяют диакритический знак (знак ударения) к непосредственно предшествующему символу, а не к базовому символу.
См. Почему некоторые сочетания диакритических знаков смещены вправо в некоторых программах? для получения дополнительной информации об этом.