在PyGame中,梵文文本渲染不正确

Nou*_*him 13 python unicode pygame text-rendering devanagari

我们有一个小型的网络应用程序,我们想要转换成原生的东西.现在,它有很多移动部件(后端,浏览器等),我们想把它转换成一个紧凑的应用程序.我们决定使用PyGame来做到这一点,除了字体渲染问题之外它一直很好.

我想呈现的字符串是कोझिकोड.这,正确呈现看起来像正确渲染.

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

现在,这在我的编辑器和浏览器中看起来很好但是当我尝试在PyGame中渲染时,我得到了这个 错误地渲染.基本上,元音符号(\ u093fÇ)应该位于left的左侧,但它看起来在它的右侧(并且在क的左侧),从而完全弄乱了它.这不会发生在浏览器或文本编辑器(具有相同的输入字符串)中,因此我猜测它是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
Run Code Online (Sandbox Code Playgroud)

这就是它的样子 渲染错误

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

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

Ila*_*sta 5

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

虽然我的 IDE 正确呈现了字符串

SDL_TTF 程序不会:

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

我仍在寻找解决方案


Nou*_*him 1

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