Неправильный рендеринг текста на деванагари в PyGame

У нас есть небольшое веб-приложение, которое мы хотим преобразовать во что-то нативное. Сейчас у него много движущихся частей (серверная часть, браузер и т. Д.), И мы хотели бы преобразовать его в единое жесткое приложение. Мы решили использовать PyGame, чтобы сделать это, и пока все было хорошо, за исключением проблемы рендеринга шрифтов.

Строка, которую я хотел бы отобразить - कोझिकोड. Это правильно выглядит как Правильно отображается,

Конкретные кодовые точки: \u0915 \u094d \u093f \u0915 \u094b и \u0921

Теперь, это выглядит хорошо в моем редакторе и моем браузере, но когда я пытаюсь отобразить его в PyGame, я получаю это Неправильно отрендерено, По сути, знак гласного (\u093f ि) должен был находиться слева от झ, но, как представляется, справа (и слева от क), таким образом, он полностью запутался. Этого не происходит в браузере или текстовом редакторе (с той же строкой ввода), поэтому я предполагаю, что это проблема рендерера в PyGame.

Есть только одно грубое исправление, которое работает только в этом конкретном случае, а именно ि (\u093f) перед झ (\u091d). В этом случае он правильно выглядит так Грубая починка, Это зависит от того, что я знаю что-то о языке и внедряю эту логику в код. Я должен иметь дело с несколькими языками здесь, так что это не реально осуществимо.

У меня нет большого опыта работы с Unicode, поэтому я не знаю, как решить эту проблему. Что я могу сделать, чтобы это исправить?

В случае, если это имеет значение, я использую шрифт freesans, который есть в Debian и который имеет необходимые глифы для рендеринга.

Обновление: код, чтобы фактически сделать это следующим образом

# -*- coding: utf-8 -*-
import time

import pygame

# Pygame setup and create root window
pygame.font.init()
screen = pygame.display.set_mode((320, 200))
empty = pygame.Surface((320, 200))


font_file = pygame.font.match_font("freesans")  # Select and
font = pygame.font.Font(font_file, 30)          # open the font
writing = font.render(u"कोिझकोड  कोझिकोड", True, (0, 0, 0))  # Render text on a surface
screen.fill((255, 255, 255)) # Clear the background
screen.blit(writing, (10, 10)) # Blit the text surface on the background
pygame.display.flip()  # Refresh the display

input() # Wait for input before quitting

вот как это выглядит Ошибка в рендеринге

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

Обновление 2: В отсутствие чего-либо еще я решил попытаться отобразить строку в изображение с помощью внешней программы, а затем скопировать это изображение на поверхность PyGame. Я попробовал imagemagick, но это портит нас так же, как это. Gimp работает отлично, и поэтому я планирую использовать пакетный режим, чтобы выполнить свою работу.

2 ответа

Решение

Мне пришлось, наконец, прибегнуть к действительно уродливому, но полезному обходному пути для моей собственной ситуации. Я написал script-fu Плагин, который принимает имя файла и текст в качестве аргументов. Затем он записывает текст и сохраняет его в формате png с помощью gimp. Моя программа затем загружает это и перетаскивает png прямо на поверхность.

Я думаю, что это проблема SDL_ttf (базовый компонент, который фактически отображает текст).

В то время как моя IDE правильно отображает строку

Программа SDL_TTF не делает:

Есть код: https://gist.github.com/ilario-pierbattista/be6b967b05fa2f1eb322f35988a33ad0

Я все еще ищу решение

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