Python汉字区位码、字符串 相互转换

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]}')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值