micropython中怎么将gb2312编码的字节流变成中文

 我来答
1funv
2019-06-10
知道答主
回答量:23
采纳率:0%
帮助的人:2.8万
展开全部
# -*- code: utf-8 -*-
# 在 micropython 中运行, 注意在运行目录下有 hzk12/16

# '啊' 是汉字区第1个汉字,对应数据为 ?不对?
# 0x00, 0x00, 0x0E, 0xFC, 0xEA, 0x08, 0xAA, 0x08,
# 0xAA, 0xE8, 0xAA, 0xA8, 0xAC, 0xA8, 0xAA, 0xA8,
# 0xAA, 0xA8, 0xAA, 0xA8, 0xEA, 0xE8, 0xAA, 0xA8,
# 0x0C, 0x08, 0x08, 0x08, 0x08, 0x28, 0x08, 0x10
# hzk16 试验: '一','我'正确, '啊' 不对?
# hzk12 字库的位长度是16*12
# seek位置 '一': 111168, '五': 103152, '我':102196

'''
int(x [,base ])         将x转换为一个整数    
long(x [,base ])        将x转换为一个长整数    
float(x )               将x转换到一个浮点数    
complex(real [,imag ])  创建一个复数    
str(x )                 将对象 x 转换为字符串    
repr(x )                将对象 x 转换为表达式字符串    
eval(str )              用来计算在字符串中的有效Python表达式,并返回一个对象    
tuple(s )               将序列 s 转换为一个元组    
list(s )                将序列 s 转换为一个列表    
chr(x )                 将一个整数转换为一个字符    
unichr(x )              将一个整数转换为Unicode字符    
ord(x )                 将一个字符转换为它的整数值    
hex(x )                 将一个整数转换为一个十六进制字符串    
oct(x )                 将一个整数转换为一个八进制字符串
bytearray(x)            列表转为数组
'''
from machine import Pin, I2C
import framebuf
import ssd1306
i2c = I2C(sda=Pin(5), scl=Pin(4))
o = ssd1306.SSD1306_I2C(128,64,i2c)

def drawhz( hzs, xp, yp ):
for x in range( len(hzs)//2 ):
c = ((hzs[x*2] - 0xA1)* 94 + (hzs[x*2+1] - 0xA1)) * 24  #gb2312 转成 区位号
f = open( 'uc_hzk12', 'rb' )
f.seek( c )
hz = bytearray( f.read(24) )
f.close()

# 创建 hzk12:16x12 or hzk16:16x16 大小帧缓存区储存图片帧,水平扫描
fb1 = framebuf.FrameBuffer(hz, 16, 12, framebuf.MONO_HLSB)
o.blit( fb1, xp + x*12, yp )  # 将fb1帧缓存送至oled显示,起始位(38,16)
xp += 1

#在 repl 中, 粘贴的中文件变码了, 装载文件形式才正常
def drawhz2(hzs, xp, yp):
for x in range(len(hzs)):
f = open('uni2gb', 'rb')
f.seek( (ord(hzs[x])-0x4e00)*2 )
gb23 = bytearray(f.read(2))
f.close()
c = ((gb23[0] - 0xA1) * 94 + (gb23[1] - 0xA1)) * \
24  # gb2312 转成 区位号
f = open('uc_hzk12', 'rb')
f.seek(c)
hz = bytearray(f.read(24))
f.close()

# 创建 hzk12:16x12 or hzk16:16x16 大小帧缓存区储存图片帧,水平扫描
fb1 = framebuf.FrameBuffer(hz, 16, 12, framebuf.MONO_HLSB)
o.blit(fb1, xp + x*12, yp)  # 将fb1帧缓存送至oled显示,起始位(38,16)
xp += 1

o.fill(0)
# uPY没法实现unicode 转 gb2312, 要借助cpython 转化成 gb2312
#现在可用 文件查表法 uni2gb  (unicode-0x4e00)转gb2312码
hzs = ( 206,210, 185,253, 193,249, 210,187, 189,218 ) #每两字节表示一个汉字
drawhz2( '\u98de\u96ea\u8fde\u5929', 0, 0 )
drawhz2( '\u98de\u96ea\u8fde\u5929\u5c04\u767d\u9e7f', 0, 13 )  #飞雪连天
drawhz( hzs, 0, 26 )
drawhz( hzs, 16, 39)
drawhz( hzs, 16, 52 )
o.show()
上海巴鲁图工程机械科技有限公司_
2022-05-15 广告
增量编码器一般输出信号是两路正交脉冲信号和一路参考信号,之所以叫增量是因为它的位置信号是通过对脉冲计数累加得到,依靠计数设备的内部记忆来记住位置,并且同每圈输出的参考信号来清除累计误差. 缺点就是断电后,需要重新寻找初始位置. 例如打印机扫... 点击进入详情页
本回答由上海巴鲁图工程机械科技有限公司_提供
就烦条0o
2017-05-30 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46492
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
micropython中好像还没有unicode方面的支持,中文解码也还没有。
不过可以参考这样的想法,GB2312编码的汉字都是双字节,ASC码都是大于127的.这样如果连续两个字符都是大于127的,就可以当成一个汉字处理。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式