汉字串显示

2022-07-24,


实现任意汉字串的屏幕显示

目录

  • 前言
  • 一、机内字模(即汉字串的表示形态)
    • 1. 点阵类型
    • 2. 矢量类型
  • 二、每个汉字的点
  • 总结

前言

  • 当前计算机汉字输入输出 / 汉字字形输出

  • 看任务,首先要做的是得到汉字串,下面开始讨论。

一、机内字模(即汉字串的表示形态)

1. 点阵类型

用点的虚实表示汉字的轮廓,每个汉字一般都用为 16x16 或 24x24 个点来表示。如下图。若把每一个字都用16x16个点表示,这些字组成一个库,叫16x16点阵字库。
该类型虽简单,但明显的缺点就是存储空间大、放大会失真。

2. 矢量类型

记录汉字字形轮廓信息中的关键点,经过数学运算输出字形。也就是平时输入法输出的字体。
缺点是需要计算。


  • 任务中提到“屏幕显示”,这里考虑“点阵类型”。

二、每个汉字的点

首先,可以通过看下面这个链接的内容 HZK16汉字16*16点阵字库的使用及示例程序 介绍任务需要用到的hzk.dat。(讲得太好了555)
这里只摘取其中最重要的绝对偏移位置计算:

offset=(94*(区码-1)+(位码-1))*32

其中,区码 = 汉字的第一个字节-0xA0;位码 = 汉字的第二个字节-0xA0。(一个汉字占两个字节)

代码如下(示例):

import struct

def RetHZOffset(HZ):
	HZs=HZ.encode("gbk")    #传成字节
	HZOffset=32*((HZs[0]-0xa0-1)*94+(HZs[1]-0xa0-1))  #偏移量计算
	return HZOffset
HZ="你"
I=open("hzk.dat","rb")      #字节读取
Offset=RetHZOffset(HZ)      #传入汉字,返回起始点位置

I.seek(Offset,0)
Dot=I.read(32)              #依次取32位
I.close()

DotInfo=struct.unpack("32B",Dot)   #可以理解成 “串起来”

for i in range(0,32):   
	#print(DotInfo[i])
	for j in range(0,8):     #一字节8位
		if  ( (0x80>>j) & DotInfo[i] ) != 0:
			print("*",end='')
		else:
			print(" ",end='')

	if 	i%2==1:                    #16位为一行,换行
		print("\n",end='')

结果如下:


总结

汉字串的屏幕显示是为实现汉字屏幕滚动显示做准备。
矢量类型的汉字显示较复杂,以后讨论。
代码一定不是最简的,文章内容如有错还望指出,谢谢~
@author: RUNT

本文地址:https://blog.csdn.net/weixin_45792211/article/details/113965909

《汉字串显示.doc》

下载本文的Word格式文档,以方便收藏与打印。