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