Python 汉字区位码、字符串 相互转换
区位码简介
GB2312所有字符放在一张94x94的矩阵中,矩阵中的每个位置对应一个字符(有的位置是空的,没有字符)。
区位码为十进制四位数,前后两位分别代表该字符在矩阵中的行、列坐标(均从1算起),如4528“图”字,为45行、28列上的字符。
能通过对区位码进行简单处理得到该字符对应的GB2312国标码,从而保存在计算机中。
区位码转为字符串步骤
步骤 | 示例 |
---|---|
获取区码、位码 | 45, 28 |
1)区码、位码分别加上0xA0(16进制数) | 45(0x2D) + 0xA0 = 0xCD 28(0x1C) + 0xA0 = 0xBC |
2)区码、位码分别放入前后两个字节中,组成国标码(GB2312码)) | b'\xCD\xBC' |
3)对国标码进行解码 | "图" |
字符串转国标码步骤
与前者相反即可
转换代码
def c2n(chinese): # 字符串(unicode)转区位码
union_code = chinese.encode('gb2312') # unicode转国标码
b = int.from_bytes(union_code, byteorder='big') - 0xa0a0
y, x = b // 0x100, b % 0x100 # 区码,位码
return y * 100 + x # 区位码
def n2c(number): # 区位码转字符串(unicode)
gb1 = number // 100 + 0xa0 # 区码+0xa0
gb2 = number % 100 + 0xa0 # 位码+0xa0
index = gb1 * 0x100 + gb2
b = bytes.fromhex(hex(index)[2:]) # 国标码
return b.decode('gb2312') # 国标码转unicode
if __name__ == '__main__':
# 测试用例
test_samples = [
('图', 4528),
('万', 4582),
('具', 3063),
]
for chinese_, number_ in test_samples:
res = (c2n(chinese_), n2c(number_))
print(f'标准:{chinese_}/{number_}, 测试结果:{res[0]}/{res[1]}')
标签:位码,chinese,Python,区位码,number,国标码,字符串
From: https://www.cnblogs.com/roundfish/p/18349155