字形集
GlyphSet 类
GlyphSet 类用于存储一系列字形,也提供一系列方法来处理这些字形。
创建字形集
创建空白字形集
直接实例化GlyphSet类可以创建一个空白字形集。
>>> from unifont_utils import GlyphSet
>>> glyph_set = GlyphSet()
但是这样创建的字形集不包含任何Unicode编码位点。我们可以使用init_glyphs方法创建新的字形集,在实例化时就涵盖某些Unicode编码,而不必先准备相应的字形。
>>> glyph_set = GlyphSet.init_glyphs([0x41, 0x42, "43", "0050", 0x55, "76"])
Note
编码范围中的元素必须为有效的Unicode编码(参见Glyph类的说明),否则会抛出ValueError异常。
如果传入的编码范围为list、set或tuple类型,那么其中的元素必须为int或str类型,否则会抛出TypeError异常。
传入的编码范围也可以是range对象。
>>> glyph_set = GlyphSet.init_glyphs(range(0x4E00, 0x9FA5))
从.hex文件加载字形集
可以使用load_hex_file方法从.hex文件中加载字形集。
提供的路径可以是Path对象,也可以是str类型的文件路径,否则会抛出TypeError异常。
>>> glyph_set = GlyphSet.load_hex_file("path/to/unifont.hex")
操作字形集中的字形
GlyphSet类提供了一系列方法来操作字形集中的字形。
添加字形
可以使用add_glyph方法向字形集中添加字形。
添加的字形必须为Glyph对象1,否则会抛出TypeError异常。
>>> from unifont_utils import Glyph, GlyphSet
>>> glyph_set = GlyphSet()
>>> glyph = Glyph("5B57")
>>> glyph_set.add_glyph(glyph)
可以使用加法运算符(+)来合并两个GlyphSet对象,得到的新GlyphSet对象中包含原先的两个字形集中的字形。
在运算时,+后面的字形集,会覆盖+前面的字形集中的字形。例如,下方的例子中,glyph_set_2会覆盖glyph_set_1中的字形。
>>> glyph_set_1 = GlyphSet.init_glyphs([0x41, 0x42])
>>> glyph_set_2 = GlyphSet.init_glyphs([0x41, 0x43, 0x44])
>>> glyph_set = glyph_set_1 + glyph_set_2
Tips
也可以使用原地加法(In-place Addition,即+=运算符)来添加字形或字形集。
>>> glyph_set += glyph
>>> glyph_set += glyph_set_1
两个Glyph对象相加可以得到一个GlyphSet对象,其中包含原先的两个字形。
>>> from unifont_utils import Glyph, GlyphSet
>>> glyph_1 = Glyph(0x4E00)
>>> glyph_2 = Glyph(0x4E01)
>>> glyph_set = glyph_1 + glyph_2
更新字形
如果字符集中已经包含了某个字形的编码位点,那么不能再使用add_glyph方法来重复添加,应当使用update_glyphs方法来更新这个字形。
更新的字形必须为Glyph对象1,否则会抛出TypeError异常。
>>> glyph_set.update_glyphs(glyph)
Tips
也可以使用下面的方式(__setitem__魔法方法)来更新字形集:
>>> glyph_set.glyphs[0x41] = glyph
删除字形
可以使用remove_glyph方法从字形集中删除字形。
>>> glyph_set.remove_glyph(glyph)
Tips
也可以使用下面的方式(__delitem__魔法方法)来删除字形:
>>> del glyph_set[0x41]
排序字形
可以使用sort_glyphs方法,按Unicode编码排序字形集中的字形。
>>> glyph_set.sort_glyphs()
获取字形集中的字形
获取字典
GlyphSet对象使用一个dict对象来存储字形,键为字形的编码位点,值为Glyph对象。
可以使用glyphs属性2来获取这个字典。
>>> glyph_set.glyphs
获取单个或多个字形
可以使用get_glyph方法来获取字形集中某个编码位点对应的字形,返回一个Glyph对象。
>>> glyph_A = glyph_set.get_glyph(0x41)
Tips
也可以使用下面的方式(__getitem__魔法方法)来获取字形:
>>> glyph_A = glyph_set[0x41]
也可以使用get_glyphs方法来获取字形集中多个编码位点对应的字形,返回一个新的GlyphSet对象。
>>> glyphs_new = glyph_set.get_glyphs([0x41, 0x42, 0x43])
字形集的其他信息
字形集的字符串表示
如果将字形集表示为字符串(如直接打印字形集),会输出这样的内容:
>>> glyph_set
Unifont Glyph Set (114 glyphs)
字形集的长度
可以使用len函数来获取字形集的长度,即其中所含字形的数量。返回值为int类型。
>>> len(glyph_set)
114
字形集的存储范围
可以使用code_points属性来获取字形集的存储范围。返回含str类型元素的list。
>>> glyph_set.code_points
['002C', '002D', '002E', '0050', '0051', '0052', '0053']
检查字形是否在字形集中
可以使用in运算符来检查某个字形是否在字形集中。
>>> glyph in glyph_set
True
遍历字形集中的字形
可以直接迭代GlyphSet对象,进而处理其中的字形。
>>> for glyph in glyph_set:
... print(glyph)
保存字形集
保存为.hex文件
可以使用save_hex_file方法将字形集保存为.hex文件。
>>> glyph_set.save_hex_file("path/to/unifont.hex")
保存为图片
可以使用save_unifont_page方法将字形集保存为图片,大小为256×256,最多包含256个字形。
这里的“Unicode Page”指的是Minecraft Java版使用的位图字体(Bitmap Font),用于在游戏中自定义字体。
>>> glyph_set.save_unifont_page("path/to/unifont_page.png")
可以指定start参数来指定保存图片的起始编码位点。传入的值必须为有效的Unicode编码,默认为4E00。
>>> glyph_set.save_unifont_page("path/to/unifont_page.png", start=0x4E01)