相关文章推荐

回顧字符編碼的前世今生

ASCII 只能儲英文或特殊字符,只占一個字節,一個字節8bit,不能儲中文,所以才出現Unicode

Unicode 不管是中文或英文,都是占二個字節,一個字節8bit

UTF-8 是一種針對Unicode的可變長度字元編碼,英文字符一樣會依照ASCII碼規範,只占一個字節8bit,而中文字符的話,統一就占三個字節

回顧可以參考 字符編碼

字符編碼解碼流程

圖解當二種不同字符編碼的轉編、解碼的過程,例如我要把一個GBK的字符編碼轉成UTF-8的過程是怎麼轉換的

  • 首先通過編碼 decode 轉換為 Unicode 編碼
  • 然後通過解碼 encode 轉換為 UTF-8 編碼
  • 那我們就先用utf-8轉gbk,來做實做看看…下面代碼都是先用 python2.7版執行

    # -*- coding:utf-8 -*-
    import sys
    print(sys.getdefaultencoding())     # 打印出目前系統字符編碼
    s = '你好'
    s_to_unicode = s.decode(encoding='utf-8')  # 要告訴decode原本的編碼是哪種
    print(s_to_unicode)
    ----------------------執行結果----------------------
    ascii
    

    剛剛上面的代碼只是先做 UTF-8 decode Unicode,不相信!!! 好吧來驗証一下

    # -*- coding:utf-8 -*-
    import sys
    print(sys.getdefaultencoding())     # 打印出目前系統字符編碼
    s = '你好'
    s_to_unicode = s.decode(encoding='utf-8')  # 要告訴decode原本的編碼是哪種
    print(s_to_unicode)
    print(s_to_unicode, type(s_to_unicode))
    ----------------------執行結果----------------------
    ascii
    (u'\u4f60\u597d', <type 'unicode'>)   # 變成一個tuple,所以就不會顯示中文
    

    上面那個看起來很像亂碼(不是亂馬),其實是unicode格式,証明我們已經確實的把 UTF-8 decode Unicode編碼了,再來就是要把 Unicode encode gbk

    # -*- coding:utf-8 -*-
    import sys
    print(sys.getdefaultencoding())     # 打印出目前系統字符編碼
    s = '你好'
    s_to_unicode = s.decode(encoding='utf-8')
    print(s_to_unicode)
    print(s_to_unicode, type(s_to_unicode))
    s_to_gbk = s_to_unicode.encode(encoding='gbk')
    print(s_to_gbk)
    ----------------------執行結果----------------------
    ascii
    (u'\u4f60\u597d', <type 'unicode'>)
    

    上面代碼已經完成Unicode encode gbk,但為什麼還是看不到字?那是目前的terminal的編碼依然是utf-8,若想看到���的話,就請修改 iTerm2 → Preference → Profiles → Terminal → Character Encoding → Chinese (GBK),然後執行一次剛剛的代碼,執行的結果會如下

    ascii
    (u'\u4f60\u597d', <type 'unicode'>)
    

    原本第二行的你好變成浣犲ソ,而最後一行的���變成你好,這樣就可以確認我們真的已經完成UTF-8 decode Unicode → Unicode encode gbk,那如果要反向操作的話呢?

    Terminal記得再調回成UTF-8,再執行一次

    # -*- coding:utf-8 -*-
    import sys
    print(sys.getdefaultencoding())     # 打印出目前系統字符編碼
    s = '你好'
    s_to_unicode = s.decode(encoding='utf-8')
    print(s_to_unicode)
    print(s_to_unicode, type(s_to_unicode))
    s_to_gbk = s_to_unicode.encode(encoding='gbk')
    print(s_to_gbk)
    print(s_to_gbk, type(s_to_gbk))
    gbk_to_utf8 = s_to_gbk.decode(encoding='gbk').encode(encoding='utf-8')
    print(gbk_to_utf8)
    print(gbk_to_utf8, type(gbk_to_utf8))
    ----------------------執行結果----------------------
    ascii
    (u'\u4f60\u597d', <type 'unicode'>)
    ('\xc4\xe3\xba\xc3', <type 'str'>)
    ('\xe4\xbd\xa0\xe5\xa5\xbd', <type 'str'>)
    在Python3因為字串已經全部統一成 unicode ,所以不必在字符串前加上 u ,這是Python2和Python3的重要差別之一,需要特別注意
    

    參考資料:

    瞭解Unicode

    字符编码笔记:ASCII,Unicode和UTF-8

    嗯…倒數三天了,太棒了,快解脫了 Orz

    請問一下..
    s編碼後.竟然不是 你好
    範例 一模一樣...不知道錯在哪???
    python2.7版本

    執行底下的範例

    import sys
    print(sys.getdefaultencoding()) # 打印出目前系統字符編碼

    s = '你好'
    print(s)
    s_to_unicode = s.decode(encoding='utf-8') # 要告訴decode原本的編碼是哪種
    print(s_to_unicode)

    最後一行改成big5即可

    -- coding:utf-8 --

    import sys
    print(sys.getdefaultencoding()) # 打印出目前系統字符編碼

    s = '你好'
    print(s)
    s_to_unicode = s.decode(encoding='utf-8') # 要告訴decode原本的編碼是哪種
    print(s_to_unicode)

    s1 = s_to_unicode.encode('big5') # 要告訴decode原本的編碼是哪種
    print(s1)

    print(s) s_to_unicode = s.decode(encoding='utf-8') # 要告訴decode原本的編碼是哪種 print(s_to_unicode) s1 = s_to_unicode.encode('big5') # 要告訴decode原本的編碼是哪種 print(s1)
     
    推荐文章