如何在Pygame中绘制非拉丁字符?

2 投票
2 回答
1102 浏览
提问于 2025-04-18 17:42

我刚开始学习编程,所以我的问题可能很简单。对此我表示抱歉!

我想用Pygame写一个程序,在屏幕上画出一个俄文单词。这个部分没问题,一切都正常:

# coding=utf-8
import pygame,sys

pygame.init()

screen = pygame.display.set_mode((640,480))

some_font=pygame.font.Font(None,30)

word_to_print=some_font.render(u'привет',True,(255,255,255),(0, 0, 0))

while 1:
        screen.blit(word_to_print,(0,0))
        for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()
        pygame.display.update()

但是当我尝试以这种形式画出同一个单词时:

some_font.render(str('привет'),True,(255,255,255),(0, 0, 0))

输出的结果看起来很奇怪,像是乱码(比如 ÐÐµÑ Ñа 这样的东西)。

我有两个问题:

1) 如何让我的程序正确显示任何俄文单词?

2) 为什么会出现这样的情况?

2 个回答

-1

默认的字体设置不支持很多非拉丁字符。如果你使用的是Windows 10,可以在你的电脑上找到字体,路径是C:\Windows\Fonts,但字体文件必须是.ttf格式(而不是.ttc格式)。如果你没有支持你需要的语言字符的合适字体,可以很容易地在网上下载一个。此外,奇怪的是,当我下载了一个在线字体后,它不能直接从Windows字体文件夹使用,我必须把它放在一个单独的文件夹里,然后通过font.Font从那里访问它。

1

1) 我该如何让我的程序绘制出俄语的字符串(比如任何俄语单词)?

严格来说,你是做不到的。如果你想显示任意的俄语文本,你应该把这些文本存储在一个 unicode() 对象中,而不是 str() 对象:

unicode_string = u'привет'
some_font.render(unicode_string, ...)

如果你没有原始的 unicode() 字符串,而只有编码后的 str() 字符串,你可以解码它,只要你知道编码方式:

str_string = 'привет'
unicode_string = str_string.decode('utf-8')
some_font.render(unicode_string, ...)

如果你应用 str() 的对象本身不是一个 str()(见你下面的评论),那么你可以直接调用 unicode()

unicode_string = unicode(my_object)
some_font.render(unicode_string, ...

最后,如果你应用 str() 的对象没有提供 .__unicode__() 方法,但返回的是一个编码后的 str() 字符串,你可以解码这个字符串,只要你知道编码方式:

str_string = str(my_object)
unicode_string = str_string.decode('utf-8')
some_font.render(unicode_string, ...

2) 为什么会这样工作?

根据 pygame 的文档,"同时接受 Unicode 和字符(字节)字符串。对于字符字符串,假设使用 LATIN1 编码。"你传递了一个 utf-8 编码的字符串给一个需要 latin1 编码字符串的方法。

撰写回答