Глифы Юникода неправильно комбинируются в Windows Forms

Проблема: яванский скрипт (используется шрифт Google Noto Sans Javanese) правильно отображаются и "объединяются" в HTML, но не в приложении Windows Forms (C# .NET, Visual Studio 2017).

Изменить. На моем компьютере установлена ​​64-разрядная версия Windows 7.

Прямая ссылка для скачивания Noto Sans Javanese (.zip)


Используемые глифы

Есть много случаев, показывающих, что глифы не сочетаются должным образом, но вот один пример, который я использовал:

  1. ЯВАНСКАЯ БУКВА NA, U+A9A4, #43428;
  2. ЯВАНСКИЙ ПАНКОН, U+A9C0, #43456;
  3. ЯВАНСКАЯ БУКВА TA, U+A9A0, #43424;
  4. ЯВАНСКИЙ ГЛАСНЫЙ ЗНАК PEPET, U+A9BC, #43452;

Прямая ссылка для скачивания спецификации Unicode для Javascript (.pdf)


Правильное/желаемое поведение

Четыре из этих глифов должны быть «объединены», став одним символом.

HTML-код:

<html>
<head>
    <meta charset="utf-8">
    <style>
    .javanese {
    font-family: "Noto Sans Javanese";
    font-size: 66px;
    }
    </style>
</head>
<body>
    <div class="javanese">ꦤ꧀ꦠꦼ</div>
    <div class="javanese">&#43428;&#43456;&#43424;&#43452;</div>
</body>
</html>

HTML-результат:

Правильный рендеринг Javanese Script в HTML


Неверный рендеринг в Windows Forms (C# .NET)

Я использую Visual Studio 2017 Community для создания настольного приложения Windows Forms.
Компоненты меток используют шрифт "Noto Sans Javenese".

Код C#:

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            this.label1.Text = "\uA9A4\uA9C0\uA9A0\uA9BC";
            this.label2.Text = "ꦤ꧀ꦠꦼ"; // Copied from HTML

            // this one is rendered correctly
            // Thai character "ko kai" (U+0E01) and combining characters "mai tho" (U+0E49).
            this.label3.Text = "\u0E01\u0E49\u0E49\u0E49\u0E49\u0E49\u0E49\u0E49\u0E49";
        }
    }
}

Результат C#:

Неправильное отображение яванского сценария в приложении Windows Form


Вопросы

  1. В чем причина такого поведения? Может кто-нибудь объяснить?
  2. Что мне нужно сделать, чтобы яванский сценарий правильно «объединялся» в приложении Windows Form?

Большое спасибо!


person topher    schedule 06.08.2017    source источник
comment
@downvoter: почему? это не корректный вопрос?   -  person topher    schedule 06.08.2017
comment
Это может быть правильный вопрос, если это какая-то странная причуда рендеринга, требующая особого внимания, поэтому я с удовольствием поддержу его, но это также может быть простой дефект в Windows Forms. Я предлагаю вам также сообщить об этом в Microsoft.   -  person Sander    schedule 06.08.2017
comment
@Сандер, спасибо! Я только что сделал поток в MSDN   -  person topher    schedule 06.08.2017
comment
Можете ли вы предоставить больше информации о вашей настройке? Я только что воспроизвел ваш проект и получил результат, который вы описали как правильный: i.imgur.com/G7lxeeP.png --- (отредактируйте, чтобы добавить: только что заметили, что ваши скриншоты выглядят так, как будто они исходят из Windows 7, в этом может быть разница. Можно попробовать установить для свойства UseCompatibleTextRendering меток значение «true». заставить метки использовать рендеринг текста GDI+, который в более старых версиях Windows лучше поддерживает расширенные сценарии.)   -  person Timothy Fries    schedule 06.08.2017
comment
@TimothyFries Спасибо, что воспроизвели мою проблему. Да, я использую Windows 7. Я пытался установить UseCompatibleTextRendering на true, но результат все равно неверный, вот скриншот. Я согласен с вами, что Win 7 может быть проблемой.   -  person topher    schedule 07.08.2017


Ответы (2)


У меня есть несколько вариантов и идей, которые помогут решить эту проблему. Судя по всему, это проблема только с Windows Forms в Windows 7.

Пока мои варианты:

  1. Переключитесь на приложение WPF (лучший вариант, на мой взгляд)
  2. Используйте Композитный элемент управления WPF внутри Windows Forms
  3. Визуализация в виде растрового изображения с использованием сторонних библиотек, например: HarfBuzz

Вот источники, кредиты принадлежат всем соответствующим авторам:


  1. cheong00 опубликовал отличное объяснение на поток MSDN:

Поскольку Win7 имеет Только поддержка Unicode 5.1 и символ ꦤ попадает в Unicode 5.2, функция рендеринга текста GDI+ может неправильно обрабатывать подсказки глифов. (Я не эксперт по проблемам i18n, поэтому не знаю, нужна ли поддержка специальной подсказки глифов)

Поскольку IE и другие веб-браузеры, такие как Chrome и Firefox, поставляются со своим собственным механизмом рендеринга шрифтов, на них не распространяются ограничения рендеринга GDI+.

Кстати, также проверено, что установка UseCompatibleTextRendering в true тоже не помогает.

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


  1. u/GoogleBingLady опубликовала обзор на тема Reddit:

Формирование шрифта (двунаправленность, формирование на основе контекста, лигатуры, позиционирование и изменение порядка) — очень, очень сложная тема. Хотя я был бы удивлен, возможно, Windows Forms не поддерживает формирование шрифта.

Обходным путем может быть использование библиотеки, такой как HarfBuzz, преобразование результата в растровое изображение, а затем отображение этого растрового изображения. Подробнее см. http://behdad.org/text/.

На самом деле ваша проблема описана здесь, на странице 8: http://www.panl10n.net/Presentations/Cambodia/Pema/LocalizationofLinux(Bhutan).pdf

person topher    schedule 07.08.2017

Windows 7 не поддерживает яванское формирование. Поддержка формирования яванского языка была добавлена ​​в Windows 8.1.

person Andrew Glass    schedule 07.08.2017