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

posted @ 2024-08-08 16:16  小鱼圆又圆  阅读(145)  评论(0)    收藏  举报