我们有一个小型 Web 应用程序,我们想将它转换成原生的东西。现在,它有很多活动部件(后端、浏览器等),我们希望将其转换为一个紧凑的应用程序。我们决定使用 PyGame 来完成这项工作,到目前为止一切都很好,除了字体渲染问题。
具体码位为 \u0915 \u094b \u091d \u093f \u0915 \u094b 和 \u0921
现在,这在我的编辑器和浏览器中看起来不错,但是当我尝试在 PyGame 中渲染它时,我得到了这个. 基本上,元音符号 (\u093f ि) 应该在 झ 的左边,但它出现在它的右边(和 क 的左边),从而完全搞砸了。这不会发生在浏览器或文本编辑器(具有相同的输入字符串)中,所以我猜这是 PyGame 中的渲染器问题。
有一个粗略的解决方法仅适用于这种特定情况,即将 ि (\u093f) 放在 झ (\u091d) 之前。在这种情况下,它会像这样正确渲染。这取决于我对语言的了解并将该逻辑放入代码中。我必须在这里处理多种语言,所以这并不可行。
我对unicode没有太多经验,所以我不知道如何解决这个问题。我能做些什么来解决这个问题吗?
万一这很重要,我使用的是 Debian 上的freesans字体,它有必要的字形来渲染它。
更新: 实际渲染的代码如下
# -*- 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:在没有其他任何东西的情况下,我决定尝试使用外部程序将字符串渲染成图像,然后将该图像 blit 到 PyGame Surface 上。我尝试了 imagemagick,但它以与此相同的方式使我们感到困惑。Gimp 工作正常,所以我打算使用批处理模式来完成我的工作。