PyGame中{〗梵文文字渲染不正确

时间:2017-05-30 05:33:32

标签: python unicode pygame text-rendering devanagari

我们有一个小型网络应用,我们希望将其转换为原生内容。现在,它有很多移动部件(后端,浏览器等),我们想把它转换成一个紧凑的应用程序。我们决定使用PyGame做到这一点,除了字体渲染问题外,它到目前为止一直没问题。

我要呈现的字符串是कोझिकोड。正确呈现的内容看起来像Correctly rendered

具体的代码点是\ u0915 \ u094b \ u091d \ u093f \ u0915 \ u094b和\ u0921

现在,这在我的编辑器和浏览器中看起来很好但是当我尝试在PyGame中渲染它时,我得到了这个Wrongly rendered。基本上,元音符号(\ u093fÇ)应该位于left的左侧,但它看起来在它的右侧(并且在क的左侧),从而完全弄乱了它。这不会发生在浏览器或文本编辑器中(具有相同的输入字符串),因此我猜测它是PyGame中的渲染器问题。

有一个原始修复只适用于这个特定情况,我把ि(\ u093f)放在झ(\ u091d)之前。在这种情况下,它会像Crude fix一样正确呈现。这依赖于我对语言的了解并将该逻辑放入代码中。我必须在这里处理多种语言,这样才不可行。

我对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

这就是Error in rendering

的样子

第一个单词是正确渲染的,但是我们通过反转元音和字母位置来完成它,就像我在原始修复中提到的那样。第二个是正确写入但未正确呈现。

更新2 : 在没有任何其他东西的情况下,我决定尝试使用外部程序将字符串渲染成图像,然后将此图像blit到PyGame Surface上。我试过imagemagick,但它以与此相同的方式混淆了我们。 Gimp工作正常,因此我计划使用批处理模式完成我的工作。

2 个答案:

答案 0 :(得分:4)

我认为是SDL_ttf问题(实际呈现文本的基础组件)。

我的IDE正确呈现字符串

SDL_TTF计划没有:

代码为:https://gist.github.com/ilario-pierbattista/be6b967b05fa2f1eb322f35988a33ad0

我还在寻找解决方案

答案 1 :(得分:1)

我不得不为自己的情况采取一种非常丑陋但可用的解决方法。我写了一个script-fu插件,它接受一个文件名和一段文本作为参数。然后它写出文本并使用gimp将其保存为png文件。然后我的程序加载它并将png直接打到表面上。