Подтвердить что ты не робот

Рендеринг лигатур Devanagari (Unicode) в Java Swing JComponent на Mac OS X

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

Строки рисуются на JComponent и принимают RenderingHints для сглаживания. Лигатуры отображаются правильно в Windows XP с пакетом обновления 2 (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).

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

Лигатуры

Многие сценарии, включая арабский и деванагари, имеют специальные орфографические правила, которые требуют объединения отдельных форм букв в специальные формы лигатуры. Правила, регулирующие образование лигатуры, могут быть довольно сложными, требуя специальных технологий script -структурирования, таких как ACE (арабский каллиграфический движок DecoType в 1980-х годах и используемый для создания всех арабских примеров в печатных изданиях Unicode Standard), который стал доказательством концепции 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, будут корректно отображать индикаторы с помощью шрифтов OpenType. (Они могут, однако, не отображать индексы с таблицами AAT правильно.)

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

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

Ответ 3

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

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

Ответ 4

Я столкнулся с той же проблемой, когда я попробовал 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.