Fonts 如何确定字体是否支持字符

Fonts 如何确定字体是否支持字符,fonts,pygame,special-characters,Fonts,Pygame,Special Characters,我正在使用pygame,我想展示这个角色⊕, 但是当我运行代码时,它显示了一个矩形,我尝试了许多其他字体,它们都是矩形或带问号的矩形。其他一些特殊的角色,比如:?,工作得很好,所以我不确定问题出在哪里。我搜索了一下,在网站上还有一个类似的问题,它说Python3.x对于特殊字符没有问题,只要字体支持。然后我检查了支持的字体⊕ 大多数字体都有 tl;博士 你如何展示⊕ 在pygame上?好的,这个问题很难回答。当Linux从字体(至少在PyGame中)呈现未实现的字形时,会得到一个空的“边框矩形”

我正在使用pygame,我想展示这个角色⊕, 但是当我运行代码时,它显示了一个矩形,我尝试了许多其他字体,它们都是矩形或带问号的矩形。其他一些特殊的角色,比如:?,工作得很好,所以我不确定问题出在哪里。我搜索了一下,在网站上还有一个类似的问题,它说Python3.x对于特殊字符没有问题,只要字体支持。然后我检查了支持的字体⊕ 大多数字体都有

tl;博士


你如何展示⊕ 在pygame上?

好的,这个问题很难回答。当Linux从字体(至少在PyGame中)呈现未实现的字形时,会得到一个空的“边框矩形”。这个矩形位于字体的基线处,两边都有空格,但顶部没有空格。可能在其他操作环境中也是如此。(最初我假设边界包围了轮廓图像,没有空间,并且很容易被检测到。)

所以现在我们可以通过检查字形的内部四分之一来检查字形渲染是否包含任何非空像素

显然,这是一种启发式方法,可能会在像
这样的字符上失败,而这些字符大多是派生字符。然而,我在一堆符号和希腊字母上测试了它,它似乎工作正常。它确实适用于OP的测试图示符

该算法首先尝试检查中心水平像素,然后检查中心垂直像素,而不是深入检查每个像素。如果两者都不产生结果,则会检查每个内部像素。如果找到一个像素,我们停止检查并返回

def glyphInFont( glyph, font ):
    """ Given a glyph and a font, use a pixel-finding heuristic to determine
        if the glyph renders to something other than an "empty border" non-existant
        font symbol.  Returns True if it renders to something. """

    result = False
    WHITE  = ( 255, 255, 255 )   # can be any colour pair with constrast
    BLACK  = (   0,   0,   0 )

    try:
        text_image = font.render( glyph, True, WHITE, BLACK )
        text_rect  = text_image.get_rect()
        x_centre = text_rect.width // 2
        y_centre = text_rect.height // 2

        # On Linux at least, non-renderable glyphs have a border.
        # work out a 50% search box, centred inside the gluph
        box_top    = y_centre - ( text_rect.height // 4 )
        box_bottom = y_centre + ( text_rect.height // 4 )
        box_left   = x_centre - ( text_rect.width // 4 )
        box_right  = x_centre + ( text_rect.width // 4 )

        # Trace a Horizontal line through the middle of the bitmap 
        # looking for non-black pixels
        for x in range( box_left, box_right ):
            if ( text_image.get_at( ( x, y_centre ) ) != BLACK ):
                result = True
                break

        # If not found already, trace a line vertically
        if ( result == False ):
            for y in range( box_top, box_bottom ):
                if ( text_image.get_at( ( x_centre, y ) ) != BLACK ):
                    result = True
                    break

        # If still not found, check every pixel in the centre-box
        if ( result == False ):
            for y in range( box_top, box_bottom ):
                for x in range( box_left, box_right ):
                    if ( text_image.get_at( ( x, y ) ) != BLACK ):
                        result = True
                        break

    except UnicodeError as uce:
        # Glyph-ID not supported
        pass  # False goes through

    return result
使用“”字体以及Linux默认系统字体进行测试

此参考程序检查字形是否以给定字体呈现,如果为真则绘制字形,否则绘制“x”

导入pygame
#窗口大小
窗宽=400
窗户高度=400
WINDOW|SURFACE=pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.resizeable
深蓝色=(3,5,54)
黄色=(255,255,0)
红色=(255,0,0)

符号=['⊕', 'Δ“,”ψ“,”您可以找到一种包含字符的字体,然后将其与您的程序捆绑在一起(如果许可证允许)。否则,请将文本预渲染为位图资源,包括这些资源。非常感谢您投入的所有时间,但当我复制并粘贴您的代码时,我得到了一个x,而不是一个x⊕ 在右下角,但其他一切都是一样的。我想可能只是我的笔记本电脑。@Mof-没有⊕ 我想这取决于使用的字体。