如何在Pygame中绘制非拉丁字符?
我刚开始学习编程,所以我的问题可能很简单。对此我表示抱歉!
我想用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 个回答
默认的字体设置不支持很多非拉丁字符。如果你使用的是Windows 10,可以在你的电脑上找到字体,路径是C:\Windows\Fonts,但字体文件必须是.ttf格式(而不是.ttc格式)。如果你没有支持你需要的语言字符的合适字体,可以很容易地在网上下载一个。此外,奇怪的是,当我下载了一个在线字体后,它不能直接从Windows字体文件夹使用,我必须把它放在一个单独的文件夹里,然后通过font.Font从那里访问它。
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
编码字符串的方法。