編碼轉換

Jason990420發表於2020-05-03

建立日期: 2020/05/03

修訂日期: None

相關軟體資訊:

Win 10 Python 3.7.6

說明: 本文請隨意引用或更改,只須標示出處及作者,作者不保證內容絕對正確無誤,如造成任何後果,請自行負責.

前言

整理一下有關各類 strbytes 的編碼轉換, 一下子想不到太多, 不一定齊全.

介紹

以下內容不細說其他各項引數, quote以及unquote 來自urllib.parse

  1. str.encode(encoding='utf-8')

    按指定的編碼轉換 str 為 bytes

  2. bytes.decode(encoding='utf-8')

    按指定的編碼轉換 bytes 為 str

  3. bytes.hex()

    轉換 byte 為十六進位數字的 str

  4. bytes.fromhex(str)

    轉換十六進位的字串為 bytes

  5. quote(str | bytes)

    轉換 bytes 或 str 為 url 編碼方式的 str

  6. unquote(str)

    轉換 url 編碼方式的 str 為 unicode str

  7. 編碼 'latin-1'

    byte 與 char 的轉換

程式碼

六種不同格式的 str 或 bytes 之間的轉換.

from urllib.parse import quote, unquote

def test(a, b):
    global flag
    if a != b:
        print(f'{a} != {b}')
        flag = False

String_Unicode = '珠海市2020年'
String_Hexcode = '\xe7\x8f\xa0\xe6\xb5\xb7\xe5\xb8\x822020\xe5\xb9\xb4'
String_Bytecode = 'e78fa0e6b5b7e5b88232303230e5b9b4'
String_Urlcode = '%E7%8F%A0%E6%B5%B7%E5%B8%822020%E5%B9%B4'

Byte_Unicode = b'\xe7\x8f\xa0\xe6\xb5\xb7\xe5\xb8\x822020\xe5\xb9\xb4'
Byte_Hexcode = b'e78fa0e6b5b7e5b88232303230e5b9b4'

flag = True

# String_Unicode
test(String_Unicode.encode().decode('latin-1'), String_Hexcode)
test(String_Unicode.encode().hex(), String_Bytecode)
test(quote(String_Unicode), String_Urlcode)
test(String_Unicode.encode(), Byte_Unicode)
test(String_Unicode.encode().hex().encode(), Byte_Hexcode)

# String_Hexcode
test(String_Hexcode.encode('latin-1').decode(), String_Unicode)
test(String_Hexcode.encode('latin-1').hex(), String_Bytecode)
test(quote(String_Hexcode.encode('latin-1')), String_Urlcode)
test(String_Hexcode.encode('latin-1'), Byte_Unicode)
test(String_Hexcode.encode('latin-1').hex().encode(), Byte_Hexcode)

# String_Bytecode
test(bytes.fromhex(String_Bytecode).decode(), String_Unicode)
test(bytes.fromhex(String_Bytecode).decode('latin-1'), String_Hexcode)
test(quote(bytes.fromhex(String_Bytecode)), String_Urlcode)
test(bytes.fromhex(String_Bytecode), Byte_Unicode)
test(bytes.fromhex(String_Bytecode).hex().encode('latin-1'), Byte_Hexcode)

# String_Urlcode
test(unquote(String_Urlcode), String_Unicode)
test(unquote(String_Urlcode).encode().decode('latin-1'), String_Hexcode)
test(unquote(String_Urlcode).encode().hex(), String_Bytecode)
test(unquote(String_Urlcode).encode(), Byte_Unicode)
test(unquote(String_Urlcode).encode().hex().encode(), Byte_Hexcode)

# Byte_Unicode
test(Byte_Unicode.decode(), String_Unicode)
test(Byte_Unicode.decode('latin-1'), String_Hexcode)
test(Byte_Unicode.hex(), String_Bytecode)
test(quote(Byte_Unicode), String_Urlcode)
test(Byte_Unicode.hex().encode(), Byte_Hexcode)

# Byte_Hexcode
test(bytes.fromhex(Byte_Hexcode.decode('latin-1')).decode(), String_Unicode)
test(bytes.fromhex(Byte_Hexcode.decode()).decode('latin-1'), String_Hexcode)
test(Byte_Hexcode.decode(), String_Bytecode)
test(quote(bytes.fromhex(Byte_Hexcode.decode('latin-1'))), String_Urlcode)
test(bytes.fromhex(Byte_Hexcode.decode('latin-1')), Byte_Unicode)

if not flag:
    print('All Pass !')
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章