Python 字元編碼
阿新 • • 發佈:2019-01-03
準備
python3中,所有的字串在記憶體中均是unicode儲存(記憶體中都是如此,包括我們在開啟txt檔案的時候),當需要儲存到硬碟或者需要傳輸的時候,轉換為其他編碼(GBK,UTF-8)
str型別在記憶體中是以unicode形式存在的
bytes型別表示形式是在字串前面加b。
本文用到的函式如下:
函式 | 說明 |
---|---|
ord() | 檢視字元在記憶體中十進位制位元組形式 |
hex() | 將十進位制轉換為十六進位制 |
encode() | 將字元編碼為位元組 |
decode() | 將位元組解碼成字元 |
本文需要理解概念:
\x:只是 16 進位制;
\d:十進位制;
\o:八進位制;
\u:unicode 碼;
編譯說明
常見的編碼器有(ascii/GBK/utf-8/unicode),以”碼”為例,我們來說明你在python中輸入字元的具體情況:
[In]:ord('碼') # 檢視"碼"在記憶體中儲存的位元組形式(unicode)
[Out]:
30721
[In]:hex(30721) # 檢視"碼"的16進製表示
[Out]:
'0x7801'
[In]:"碼".encode("unicode_escape") # 另一種檢視"碼"的16進製表示
[Out]:
b'\\u7801'
[In]:b'\\u7801'.decode("unicode_escape" ) # 使用unicode反編譯
[Out ]:
'碼'
[In]:"碼".encode("utf-8") # 檢視"碼"編譯成utf-8的位元組形式,\x是轉譯,將e7轉譯成十六進位制
[Out]:
b'\xe7\xa0\x81'
[In]:int(0xe7a081) # 檢視"碼"的utf-8十進位制位元組形式
[Out]:
15179905
[In]:b'\xe7\xa0\x81'.decode("utf-8") # 將二進位制編譯為字元
[Out]:
'碼'
[In]:"碼".encode("GBK") # 檢視"碼"編譯成utf-8的位元組形式,\x是轉譯,將e7轉譯成十六進位制
[Out]:
b'\xc2\xeb'
[In]:int(0xc2eb ) # 檢視"碼"的GBK十進位制位元組形式
[Out]:
49899
[In]:b'\xc2\xeb'.decode("GBK") # 將二進位制編譯為字元
[Out]:
'碼'
讀取檔案說明
一般我們說的GBK 到unicode是decode過程是不準確的,因為這個過程中本身就有decode和encode的過程
標準編碼
編解碼器 | 別名 | 語言 |
---|---|---|
ascii | 646,us-ascii | 英語 |
big5 | big5-tw,csbig5 | 繁體中文 |
big5hkscs | big5-hkscs,hkscs | 繁體中文 |
cp037 | IBM037,IBM039 | 英語 |
cp273 | 273,IBM273,csIBM273 | 德語 |
cp424 | EBCDIC-CP-HE,IBM424 | 希伯來語 |
cp437 | 437,IBM437 | 英語 |
cp500 | EBCDIC-CP-BE,EBCDIC-CP-CH,IBM500 | 西歐 |
cp720 | 阿拉伯 | |
cp737 | 希臘語 | |
cp775 | IBM775 | 波羅的海語言 |
cp850 | 850,IBM850 | 西歐 |
cp852 | 852,IBM852 | 中歐和東歐 |
cp855 | 855,IBM855 | 保加利亞語,白俄羅斯語,馬其頓語,俄語,塞爾維亞語 |
cp856 | 希伯來語 | |
cp857 | 857,IBM857 | 土耳其 |
cp858 | 858,IBM858 | 西歐 |
cp860 | 860,IBM860 | 葡萄牙語 |
cp861 | 861,CP-IS,IBM861 | 冰島的 |
cp862 | 862,IBM862 | 希伯來語 |
cp863 | 863,IBM863 | 加拿大 |
cp864 | IBM864 | 阿拉伯 |
cp865 | 865,IBM865 | 丹麥語,挪威語 |
cp866 | 866,IBM866 | 俄語 |
cp869 | 869,CP-GR,IBM869 | 希臘語 |
cp874 | 泰國 | |
cp875 | 希臘語 | |
cp932 | 932,ms932,mskanji,ms-kanji | 日本 |
cp949 | 949,ms949,uhc | 韓語 |
cp950 | 950,ms950 | 繁體中文 |
cp1006 | 烏爾都語 | |
cp1026 | ibm1026 | 土耳其 |
cp1125 | 1125,ibm1125,cp866u,ruscii | 烏克蘭 |
cp1140 | ibm1140 | 西歐 |
cp1250 | windows-1250 | 中歐和東歐 |
cp1251 | windows-1251 | 保加利亞語,白俄羅斯語,馬其頓語,俄語,塞爾維亞語 |
cp1252 | windows-1252 | 西歐 |
cp1253 | windows-1253 | 希臘語 |
cp1254 | windows-1254 | 土耳其 |
cp1255 | windows-1255 | 希伯來語 |
cp1256 | windows-1256 | 阿拉伯 |
cp1257 | windows-1257 | 波羅的海語言 |
cp1258 | windows-1258 | 越南語 |
cp65001 | 僅限Windows:Windows UTF-8(CP_UTF8) | |
euc_jp | eucjp, ujis, u-jis | 日本 |
euc_jis_2004 | jisx0213,eucjis2004 | 日本 |
euc_jisx0213 | eucjisx0213 | 日本 |
euc_kr | euckr,korean,ksc5601,ks_c-5601,ks_c-5601-1987,ksx1001,ks_x-1001 | 韓語 |
gb2312 | chinese, csiso58gb231280, euc- cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso- ir-58 | 簡體中文 |
gbk | 936,cp936,ms936 | 統一中文 |
gb18030 | gb18030-2000 | 統一中文 |
赫茲 | hzgb,hz-gb,hz-gb-2312 | 簡體中文 |
iso2022_jp | csiso2022jp,iso2022jp,iso-2022-jp | 日本 |
iso2022_jp_1 | iso2022jp-1,iso-2022-jp-1 | 日本 |
iso2022_jp_2 | iso2022jp-2,iso-2022-jp-2 | 日語,韓語,簡體中文,西歐,希臘語 |
iso2022_jp_2004 | iso2022jp-2004,iso-2022-jp-2004 | 日本 |
iso2022_jp_3 | iso2022jp-3,iso-2022-jp-3 | 日本 |
iso2022_jp_ext | iso2022jp-ext,iso-2022-jp-ext | 日本 |
iso2022_kr | csiso2022kr,iso2022kr,iso-2022-kr | 韓語 |
latin_1 | iso-8859-1,iso8859-1,8859,cp819,latin,latin1,L1 | 西歐 |
iso8859_2 | iso-8859-2,latin2,L2 | 中歐和東歐 |
iso8859_3 | iso-8859-3,latin3,L3 | 世界語,馬耳他語 |
iso8859_4 | iso-8859-4,latin4,L4 | 波羅的海語言 |
iso8859_5 | iso-8859-5, cyrillic | 保加利亞語,白俄羅斯語,馬其頓語,俄語,塞爾維亞語 |
iso8859_6 | iso-8859-6,arabic | 阿拉伯 |
iso8859_7 | iso-8859-7,greek,greek8 | 希臘語 |
iso8859_8 | iso-8859-8,hebrew | 希伯來語 |
iso8859_9 | iso-8859-9, latin5, L5 | 土耳其 |
iso8859_10 | iso-8859-10,latin6,L6 | 北歐語言 |
iso8859_11 | iso-8859-11 | 泰語 |
iso8859_13 | iso-8859-13,latin7,L7 | 波羅的海語言 |
iso8859_14 | iso-8859-14,latin8,L8 | 凱爾特語 |
iso8859_15 | iso-8859-15,latin9,L9 | 西歐 |
iso8859_16 | iso-8859-16,latin10,L10 | 東南歐 |
johab | cp1361,ms1361 | 韓語 |
koi8_r | 俄語 | |
koi8_t | 塔吉克 | |
koi8_u | 烏克蘭 | |
kz1048 | kz_1048,strk1048_2002,rk1048 | 哈薩克 |
mac_cyrillic | maccyrillic | 保加利亞語,白俄羅斯語,馬其頓語,俄語,塞爾維亞語 |
mac_greek | macgreek | 希臘語 |
mac_iceland | maciceland | 冰島的 |
mac_latin2 | maclatin2,maccentraleurope | 中歐和東歐 |
mac_roman | macroman,macintosh | 西歐 |
mac_turkish | macturkish | 土耳其 |
ptcp154 | csptcp154, pt154, cp154, cyrillic-asian | 哈薩克 |
shift_jis | csshiftjis,shiftjis,sjis,s_jis | 日本 |
shift_jis_2004 | shiftjis2004,sjis_2004,sjis2004 | 日本 |
shift_jisx0213 | shiftjisx0213,sjisx0213,s_jisx0213 | 日本 |
utf_32 | U32,utf32 | 所有語言 |
utf_32_be | UTF-32BE | 所有語言 |
utf_32_le | UTF-32LE | 所有語言 |
utf_16 | U16,utf16 | 所有語言 |
utf_16_be | UTF-16BE | 所有語言 |
utf_16_le | UTF-16LE | 所有語言 |
utf_7 | U7,unicode-1-1-utf-7 | 所有語言 |
utf_8 | U8,UTF,utf8 | 所有語言 |
utf_8_sig | 所有語言 |
python的特定編碼
編解碼器 | 別名 | 目的 |
---|---|---|
idna | 實現 RFC 3490,另請參見encodings.idna。僅支援errors=’strict’。 | |
mbcs | dbcs | Windows only: Encode operand according to the ANSI codepage (CP_ACP) |
palmos | Encoding of PalmOS 3.5 | |
punycode | 實現 RFC 3492。不支援有狀態的編解碼器。 | |
raw_unicode_escape | 對於其他程式碼點,使用\uXXXX和\UXXXXXXXX進行拉丁語-1編碼。現有反斜槓不以任何方式轉義。它用於Python pickle協議。 | |
未定義 | 引發所有轉換(甚至是空字串)的異常。錯誤處理程式被忽略。 | |
unicode_escape | 在ASCII編碼的Python原始碼中,編碼適合作為Unicode字面值的內容,但引號不會轉義。從Latin-1原始碼解碼。注意,Python原始碼實際上預設使用UTF-8。 |