Python 漢字區位碼、字串 相互轉換

小鱼圆又圆發表於2024-08-08

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

相關文章