Неправильный рендеринг текста на деванагари в 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
Я все еще ищу решение