准备
python3中,所有的字符串在内存中均是unicode保存(内存中都是如此,包括我们在打开txt文件的时候),当需要保存到硬盘或者需要传输的时候,转换为其他编码(GBK,UTF-8)
str类型在内存中是以unicode形式存在的
bytes类型表示形式是在字符串前面加b。
本文用到的函数如下:
函数 | 说明 |
---|---|
ord() | 查看字符在内存中十进制字节形式 |
hex() | 将十进制转换为十六进制 |
encode() | 将字符编码为字节 |
decode() | 将字节解码成字符 |
本文需要理解概念:
\x:只是 16 进制;
\d:十进制;
\o:八进制;
\u:unicode 码;
书写字节
str1 = '\\u7801'
bytes(str1,encoding='utf-8')
# 这个和直接书写b`\\u7801`是等价的
# 也可以使用encode
b=str1.encode('utf-8')
string=str(str1,'utf-8')
string=str.decode()
疑问
'\\u7801'.encode('utf8').decode('utf8') # 结果不变'\\u7801'
'\\u7801'.encode('utf8').decode('unicode_escape') # 结果变为'码'
编译说明
常见的编码器有(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。 |
参考文献:
http://python.usyiyi.cn/translate/python_352/library/codecs.html