У нас есть небольшое веб-приложение, которое мы хотим преобразовать в нечто родное. Сейчас у него много движущихся частей (бэкэнд, браузер и т.д.), И мы хотели бы преобразовать его в одно жесткое приложение. Мы решили использовать PyGame для этого, и до сих пор это было прекрасно, за исключением проблемы с отображением шрифтов.
Строка, которую я хочу сделать, - कोझिकोड. Это правильно выглядит как .
Конкретные кодовые точки:\u0915\u094b\u091d\u093f\u0915\u094b и \u0921
Теперь это выглядит хорошо в моем редакторе и в моем браузере, но когда я пытаюсь выполнить его в PyGame, я получаю это . В принципе, знак гласного (\ u093f ि) должен был находиться слева от झ, но он справа от него (и слева от क), тем самым полностью испортил его. Это не происходит в браузере или текстовом редакторе (с той же входной строкой), поэтому я предполагаю, что это проблема рендеринга в PyGame.
Существует одно грубое исправление, которое работает только в этом конкретном случае, когда я s помещает ि (\ 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 Surface. Я попробовал imagemagick, но это путает нас так же, как это. Gimp работает отлично, поэтому я планирую использовать пакетный режим для выполнения моей работы.