Неверный перевод текста Devanagari в PyGame

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

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

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

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

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

У меня нет большого опыта работы с 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 Surface. Я попробовал imagemagick, но это путает нас так же, как это. Gimp работает отлично, поэтому я планирую использовать пакетный режим для выполнения моей работы.

Ответ 1

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

Ответ 2

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

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

HgbE8U2l.png

В программе SDL_TTF нет:

mF6LoUml.png

Имеется код: https://gist.github.com/ilario-pierbattista/be6b967b05fa2f1eb322f35988a33ad0

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