GB2312編碼下全角轉半角的Python實現

運行環境

  • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章