天天看點

python 編碼亂碼問題(decode,encode)

  • ANSI:

    ANSI字元串我們最熟悉,英文占一個位元組,漢字2個位元組,以一個\0結尾,常用于txt文本檔案

  • Unicode:
    • Unicode字元串每個字元(漢字、英文字母)都占2個位元組,以2個連續的\0結尾;
    • NT作業系統核心用的是這種字元串,常被定義為typedef unsigned short wchar_t;是以我們有時常會見到什麼char無法轉換為unsigned short之類的錯誤,其實就是unicode。
    • little endian: 最低位位址存放低位位元組,可稱低位優先,記憶體從最低位址開始按順序存放(低數位數字先寫)。最低位位元組放最前面。
    • big endian: 最低位位址存放高位位元組,可稱高位優先,記憶體從最低位址開始按順序存放(高數位數字先寫)。最高位位元組放最前面。
  • UTF8:

    UTF8是Unicode一種壓縮形式。

    • 英文A在unicode中表示為0x0041,老外覺得這種存儲方式太浪費,

      因為浪費了50%的空間,于是就把英文壓縮成1個位元組,成了utf8編碼,但是漢字在utf8中占3個位元組,

      顯然用做中文不如ANSI合算,這就是中國的網頁用作ANSI編碼而老外的網頁常用utf8的原因。

  • 簽名BOM:

    BOM 是 Byte Order Mark 的縮寫(位元組順序标記),是編碼方案裡用于辨別編碼的标準标記。

    • ANSI 檔案沒有 BOM
    • UTF-8 檔案的 BOM 為:EF BB BF,不過 UTF-8 檔案可以有 BOM,也可以沒有 BOM
    • Unicode big endian 檔案的 BOM 為:FE FF
    • Unicode little endian 檔案的 BOM 為:FF FE

以上是各編碼常識。

錯誤代碼:

UnicodeEncodeError: 'ascii' codec can't encode characters in position -: ordinal not in range()
           

字元串在python内部的表示是unicode編碼,是以,在做編碼轉換時,通常需要unicode作為中間編碼,即先将其他編碼的字元串解碼(decode) 成unicode,再從unicode 編碼(encode) 成另一種編碼。

- decode: 将其他編碼的字元串轉換成unicode編碼,如str1.decode(‘gb2312’),表示将gb2312編碼的字元串str1轉成unicode編碼。

- encode: 将unicode編碼轉換成其他編碼的字元串,如str2.encode(‘gb2312’),表示将unicode編碼的字元串str2轉成gb2312編碼。

是以 :轉碼的時候一定要先搞明白,字元串str是什麼編碼,然後decode成unicode,然後再encode成其他編碼

  • 如:s=’中文’

    如果是在utf8的檔案中,該字元串就是utf8編碼,如果是在gb2312的檔案中,則其編碼為gb2312。這種情況下,要進行編碼轉換,都需 要先用decode方法将其轉換成unicode編碼,再使用encode方法将其轉換成其他編碼。通常,在沒有指定特定的編碼方式時,都是使用的系統默 認編碼建立的代碼檔案。

  • 如:s=u’中文’

    則該字元串的編碼就被指定為unicode了,即python的内部編碼,而與代碼檔案本身的編碼無關。是以,對于這種情況做編碼轉換,隻需要直接使用encode方法将其轉換成指定編碼即可。

以下,關于python 相關編碼代碼解釋:

當你在py檔案的第一行中,寫了這句話,并确實按照這個編碼儲存了文本的話,那麼這句話有以下幾個功能。

1. 使得詞法分析器能正常運作,對于注釋中的中文不報錯了。

2. 對于u”中文”這樣literal string能知道兩個引号中的内容是utf8編碼的,然後能正确轉換成unicode

3. “中文”對于這樣的literal string你會知道,這中間的内容是utf8編碼,然後就可以正确轉換成其它編碼或unicode了。

sys.getfilesystemencoding()
           

傳回的字元編碼用于将Unicode檔案名映射到底層作業系統使用的檔案名。

對于Windows傳回’mbcs’, 或對于Macintosh OSX傳回’utf-8’。在UNIX系統上,編碼取決于區域設定并将傳回區域參數CODESET的值。在使用預設編碼的系統上可能傳回None。

-未完待續。。。