Рендеринг ливанаций Деванагари (Unicode) в Java Swing JComponent на Mac OS X - PullRequest
22 голосов
/ 13 мая 2011

Я пытаюсь правильно отображать лигатуры Деванагари (в строках Unicode) в Mac OS X 10.6.

Строки нарисованы на JComponent и принимают RenderingHints для сглаживания. Лигатуры отображаются правильно в Windows XP SP2 и 7 и в Ubuntu, но в Mac OS X лигатуры разлагаются (или, скорее, не объединяются правильно), диакритические знаки удаляются со своих позиций и т. Д. (См. Скриншоты ниже, правильный пример рендеринга из Win XP SP2 слева (с RenderingHints ключом сглаживания ON), неправильный пример рендеринга из Mac OS X 10.6.7 справа (сглаживание DEFAULT = OFF).

Я установил шрифт следующим образом, поэтому он должен использовать шрифт по умолчанию в любой системе:

new Font(null,Font.PLAIN,20);

Я полагаю, что все это может иметь какое-то отношение к тому факту, что кодировкой символов по умолчанию на Mac является MacRoman (НЕ подмножество UTF-8), а другие системы (например, Windows) используют подмножество UTF-8 (например, WinLatin-1) или cp1252 или тому подобное.

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

correct and incorrect rendering of the same string

Я уже пробовал несколько вещей:

  • Установка шрифта на Devanagari MT не решила проблему
  • TextAttribute LIGATURES_ON не решил проблему

Я был бы чрезвычайно благодарен за любые подсказки или фрагменты кода от других разработчиков (предпочтительно с фоном хинди, который разрабатывает на Mac).

Ответы [ 4 ]

6 голосов
/ 17 мая 2011

Я сам не эксперт, но здесь несколько советов. Насколько я понял из Википедии, проблема, скорее всего, заключается в вашем шрифте. Заранее извиняюсь за длинные цитаты, но иначе я мог бы просто связать 2 статьи Википедии.

Здесь часть раздела о лигатурах из статьи Unicode :

лигатуры

Многие сценарии, в том числе арабский и деванагари, имеют специальные правила орфографии, которые требуют объединения определенных комбинаций букв в специальные лигатурные формы. Правила, регулирующие формирование лигатур, могут быть довольно сложными, требуя специальных технологий формирования сценариев , таких как ACE (Арабский каллиграфический движок от DecoType в 1980-х годах), которые использовались для генерации всех арабских примеров в печатных изданиях стандарта Unicode ), что стало подтверждением концепции OpenType (Adobe и Microsoft), Graphite (SIL International) или AAT (Apple) .

Более подробная информация в статье AAT (Apple Advanced Typography) содержит следующую информацию. Я рекомендую прочитать всю статью.

AAT и OpenType в Mac OS X

Начиная с Mac OS X 10.5 Leopard, доступна частичная поддержка OpenType. В настоящее время поддержка ограничена западными шрифтами и арабским языком (по состоянию на 2011 год). Если у шрифта есть таблицы AAT, они будут использоваться для типографики. Если у шрифта нет таблиц AAT, но есть таблицы OpenType, они будут использоваться в той степени, в которой их поддерживает система.

Это означает, что многие шрифты OpenType для западных или ближневосточных сценариев могут быть использованы без изменений в Mac OS X 10.5, но южноазиатские сценарии, такие как тайский и деванагари, не могут. Для них требуется таблица AAT для правильного размещения.

А позже в разделе о расположении шрифтов:

Поскольку AAT работает полностью с глифами, а не с символами, вся информация макета, необходимая для создания правильного отображения, находится внутри самого шрифта. Это позволяет добавлять шрифты для новых сценариев без какой-либо специальной поддержки из ОС.

И последнее:

AAT для индийских скриптов

Для индийских сценариев единственными необходимыми функциями являются переупорядочение и замена глифов. AAT поддерживает оба из них. Как отмечалось выше, шрифты OpenType для индийских сценариев требуют добавления таблиц AAT, прежде чем они будут работать должным образом в Mac OS X. Однако обратите внимание, что это относится только к программному обеспечению, зависящему от системной поддержки OpenType. Программы, которые предоставляют свою собственную реализацию OpenType, будут правильно отображать Indic со шрифтами OpenType. (Однако они могут неправильно отображать шрифты Indic с таблицами AAT.)

Mac OS X 10.5 поставляется со шрифтами для деванагари, гурмухи, гуджарати, тайского, тибетского и тамильского языков. Шрифты для других индийских скриптов доступны от третьих лиц.

Может быть, вам нужно выбрать шрифт, который явно поддерживает Devanagari.

3 голосов
/ 20 июня 2011

Использование Quartz Renderer вместо Java 2D рендеринга.

Это существенно влияет на качество рендеринга глифов. Это должно быть сделано в первую очередь, как предложено здесь .

if (System.getProperty("os.name").startsWith("Mac OS X")) {
    System.setProperty("apple.awt.graphics.UseQuartz", "true");
}

Вы также можете использовать TextLayout, поскольку FontRenderContext может применяться RenderingHints.KEY_FRACTIONALMETRICS.

1 голос
/ 16 июня 2011

У меня точно такая же проблема с проектом, над которым я работаю со сценарием Гурмухи.Сейчас я попробовал как шрифты с таблицами AAT, которые поставляются в комплекте с Mac OS X (Gurmukhi MT, Gurmukhi MN), так и шрифты с таблицами OpenType.Ни один из них не работает в JAVA на Mac OS X, но шрифты OpenType немного более читабельны.Единственная проблема заключается в том, что «halant» символ не отображает половину форм символов, как это должно быть.

Я думаю, что проблема в используемых нами шрифтах и ​​их совместимости с JAVA в Mac OS X.

0 голосов
/ 17 марта 2016

Я столкнулся с той же проблемой, когда пытался http://jambula.sourceforge.net на Mac для тамильского языка.

Обходной путь, который я нашел, заключался в использовании Font.createFont для загрузки явного шрифта.

Вы можете увидеть тестовую программу по адресу: TestRendering.java

java org.jambula.image.TestRendering text.png

неправильно отображает тамильский текст в text.png

Однако

java org.jambula.image.TestRendering text.png "/Library/Fonts/Arial Unicode.ttf"

отображает его правильно.

Это может быть связано с https://bugs.openjdk.java.net/browse/JDK-7162125.

...