终端输出 HZK16(F) 点阵字

终端输出 HZK16(F) 点阵字

HZK16 点阵字是诸多点阵电显使用的字库文件。小时候常常乘坐的 36 路公交车,使用的应该就是这个字库,因为 HZK16 的全角感叹号很有特色(目前已经比较少见到了)。一些普速列车上的电显似乎也是用此字体。为表怀念,便尝试实现输出一下。

需要准备 HZK16 或 HZK16F 点阵字文件;此外,要新建 display.txt 文件,在里面填写打印的字符内容。

可以用 ASCII 实现好多有意思的事情,比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
              ┌─────────┐
              │厦门火车站欢迎您!│
              └─────────┘

              到 达 列 车 信 息

 车 次   始 发  终 到   开 点   检票口  站 台  状 态
K46    福 州  北 京  08∶58   7    1   正 点
D6333  厦 门  福 鼎  09∶03   5    2   正 点
D1     哈尔滨  北京南  10∶10   4    3   晚点1分
Z346   厦 门  贵 阳  11∶17   2    5   正 点
D3217  上海虹桥 深圳北  15∶08   3    2   正 点
D4010  汉 口  厦 门  15∶21   5    4   晚点2时
1033   厦 门  福 州  15∶50   4    1   正 点
L5432  厦 门  建 瓯  16∶01   6    3   正 点
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
97年03月15日。     天气:中到大雨。       00∶11∶01

旅客们,接市气象台通知,受强台风“杜苏芮”影响,即时起,途径厦门站的所有车次列
车停运。给您造成的不便敬请谅解!恢复时间另行通知。

华夏电子有限公司高端电子显示屏 R 合作电话:0592-2039489

火车站显示牌

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
新12年03月16日星期六(20∶00)
──────警告!警告!警告!──────
侦测到实体闯入安全规则特别区。
立即启动措施?1)是 2)否
正在清除实体……清除失败。
安全规则特别区存在危险,启动自毁程序。

新12年03月16日星期六(20∶12)
─────────通☆知─────────
安全规则已更新。
接上级通知,即时起,封锁安全规则特别区,清
除区域内诸实体。普遍安全规则区守戒级别更订
为严重紧张。
已请求10基地增援。

新12年03月16日星期六(20∶14)
─────────命☆令─────────
第001号命令:
◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇
讯息接收失败。
警告:中央情报室可能正在遭受攻击。

征01年03月16日星期六(20∶21)
─────────命☆令─────────
第002号命令:(远程发布,非公开)
全体人员迅速撤离!
10基地已全面接管中央情报室。
中央情报室

征01年03月16日星期六(20∶22)
─────────命☆令─────────
第003号命令:
决定清除电显终端本地历史记录。

征01年03月16日星期六(20∶22)
─────────命☆令─────────
第004号命令:
决定执行管制。

征01年03月16日星期六(20∶22)
─────────命☆令─────────
第005号命令:(远程发布,非公开)
我室结束使命。

模拟恐怖

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import binascii
import os
import time

KEYS = [0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01]

def printPlay(textStr,line,background):
# 初始化16*16的点阵位置,每个汉字需要16*16=256个点来表示,需要32个字节才能显示一个汉字
# 之所以32字节:256个点每个点是0或1,那么总共就是2的256次方,一个字节是2的8次方
rect_list = [] * 16
for i in range(16):
rect_list.append([] * 16)

for text in textStr:
#获取中文的gb2312编码,一个汉字是由2个字节编码组成
gb2312 = text.encode('gb2312')
#将二进制编码数据转化为十六进制数据
hex_str = binascii.b2a_hex(gb2312)
#将数据按unicode转化为字符串
result = str(hex_str, encoding='utf-8')

#前两位对应汉字的第一个字节:区码,每一区记录94个字符
area = eval('0x' + result[:2]) - 0xA0
#后两位对应汉字的第二个字节:位码,是汉字在其区的位置
index = eval('0x' + result[2:]) - 0xA0
#汉字在HZK16中的绝对偏移位置,最后乘32是因为字库中的每个汉字字模都需要32字节
offset = (94 * (area-1) + (index-1)) * 32

font_rect = None

#读取HZK16汉字库文件
with open("HZK16", "rb") as f:
#找到目标汉字的偏移位置
f.seek(offset)
#从该字模数据中读取32字节数据
font_rect = f.read(32)

#font_rect的长度是32,此处相当于for k in range(16)
for k in range(len(font_rect) // 2):
#每行数据
row_list = rect_list[k]
for j in range(2):
for i in range(8):
asc = font_rect[k * 2 + j]
#此处&为Python中的按位与运算符
flag = asc & KEYS[i]
#数据规则获取字模中数据添加到16行每行中16个位置处每个位置
row_list.append(flag)

#根据获取到的16*16点阵信息,打印到控制台
for row in rect_list:
for i in row:
if i:
#前景字符(即用来表示汉字笔画的输出字符)
print(line, end=' ')
else:

# 背景字符(即用来表示背景的输出字符)
print(background, end=' ')
print()

#----------------------------以上是库的引用和函数定义,下面是代码正文----------------------
#允许用户自定义输入汉字短语

os.system('clear')

with open('display.txt', 'r') as file:
li = []
for f in file.readlines():
f = f.rstrip('\n')
if f == "":
time.sleep(5)
li.append(f)
# print(li)
#自定义点阵字中笔画的符号
lineSign = '●'
#备选方案
#lineSign = "0"

#自定义点阵字的背景符号
backgroundSign = ' '
#备选方案
#backgroundSign = "."

#调用之前定义好的函数,打印最终成果
printPlay(f,lineSign,backgroundSign)
time.sleep(0.01)
作者

o0o0o0o

发布于

2024-03-16

更新于

2024-05-10

许可协议

评论