Python 字符编码

准备

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]:
'码'

读取文件说明

Python 字符编码_第1张图片
一般我们说的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

你可能感兴趣的:(python,基础)