運行環境
- python3.7
實現思路:
gb2312在文件中的二進制使用的機內碼,這裏需要區分一下區位碼和機內碼(這裏忽略了國標碼的介紹,感興趣的可以去百度一下)。
- 區位碼是gb2312表上每一個字符對應的位置的編碼,gb2312將字符集分成了94個區,一個區內又有94個字符,區內碼=區號(2位) 區內位置(2位)。
- 機內碼則是gb2312在機器內的表示,機內碼=區位碼+0xA0A0H。
由此我們也可以知道gb2312的編碼範圍爲0xA1A1-0xFEFE
因此接下的事情就是每兩個字符判斷一下它們的取值範圍,如果滿足則說明是gb2312編碼
這裏再說一下全角字符和半角字符的區別,在gb2312中,全角字符佔2個字節,而半角字符只佔1個字節,對於第三區位的字符來說,半角字符的值=全角字符的第二個字節-0x80H。
第三區位的區位表
下面是實現的代碼,這裏注意的是轉化的全角僅僅包括第三區位的符號,並沒有包括空格,空格全角的機內碼爲0xA1A1,半角的十六進制碼爲0x20,如果需要可以自行添加轉化。
def f2b(contents: bytes):
r = bytearray()
skip = False
for i in range(len(contents) - 1):
if skip:
skip = False
continue
t1 = contents[i]
t2 = contents[i + 1]
# GB2312的機內碼的編碼範圍
if 0xA1 <= t1 <= 0xFE and 0xA1 <= t2 <= 0xFE:
# 第三區位的字符,即要替換的全角字符所在的區位
if t1 == 0xA3:
r.append(t2 - 0x80)
else:
r.append(t1)
r.append(t2)
# 兩個字節都添加,則要跳過下一個字節
skip = True
else:
r.append(t1)
# 補充末尾,如果最後沒有跳過字符的話
if not skip:
r.append(contents[-1])
return r