-
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。
-未完待續。。。