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

读取文件说明

这里写图片描述
一般我们说的GBK 到unicode是decode过程是不准确的,因为这个过程中本身就有decode和encode的过程

标准编码

编解码器别名语言
ascii646,us-ascii英语
big5big5-tw,csbig5繁体中文
big5hkscsbig5-hkscs,hkscs繁体中文
cp037IBM037,IBM039英语
cp273273,IBM273,csIBM273德语
cp424EBCDIC-CP-HE,IBM424希伯来语
cp437437,IBM437英语
cp500EBCDIC-CP-BE,EBCDIC-CP-CH,IBM500西欧
cp720阿拉伯
cp737希腊语
cp775IBM775波罗的海语言
cp850850,IBM850西欧
cp852852,IBM852中欧和东欧
cp855855,IBM855保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
cp856希伯来语
cp857857,IBM857土耳其
cp858858,IBM858西欧
cp860860,IBM860葡萄牙语
cp861861,CP-IS,IBM861冰岛的
cp862862,IBM862希伯来语
cp863863,IBM863加拿大
cp864IBM864阿拉伯
cp865865,IBM865丹麦语,挪威语
cp866866,IBM866俄语
cp869869,CP-GR,IBM869希腊语
cp874泰国
cp875希腊语
cp932932,ms932,mskanji,ms-kanji日本
cp949949,ms949,uhc韩语
cp950950,ms950繁体中文
cp1006乌尔都语
cp1026ibm1026土耳其
cp11251125,ibm1125,cp866u,ruscii乌克兰
cp1140ibm1140西欧
cp1250windows-1250中欧和东欧
cp1251windows-1251保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
cp1252windows-1252西欧
cp1253windows-1253希腊语
cp1254windows-1254土耳其
cp1255windows-1255希伯来语
cp1256windows-1256阿拉伯
cp1257windows-1257波罗的海语言
cp1258windows-1258越南语
cp65001仅限Windows:Windows UTF-8(CP_UTF8)
euc_jpeucjp, ujis, u-jis日本
euc_jis_2004jisx0213,eucjis2004日本
euc_jisx0213eucjisx0213日本
euc_kreuckr,korean,ksc5601,ks_c-5601,ks_c-5601-1987,ksx1001,ks_x-1001韩语
gb2312chinese, csiso58gb231280, euc- cn, euccn, eucgb2312-cn, gb2312-1980, gb2312-80, iso- ir-58简体中文
gbk936,cp936,ms936统一中文
gb18030gb18030-2000统一中文
赫兹hzgb,hz-gb,hz-gb-2312简体中文
iso2022_jpcsiso2022jp,iso2022jp,iso-2022-jp日本
iso2022_jp_1iso2022jp-1,iso-2022-jp-1日本
iso2022_jp_2iso2022jp-2,iso-2022-jp-2日语,韩语,简体中文,西欧,希腊语
iso2022_jp_2004iso2022jp-2004,iso-2022-jp-2004日本
iso2022_jp_3iso2022jp-3,iso-2022-jp-3日本
iso2022_jp_extiso2022jp-ext,iso-2022-jp-ext日本
iso2022_krcsiso2022kr,iso2022kr,iso-2022-kr韩语
latin_1iso-8859-1,iso8859-1,8859,cp819,latin,latin1,L1西欧
iso8859_2iso-8859-2,latin2,L2中欧和东欧
iso8859_3iso-8859-3,latin3,L3世界语,马耳他语
iso8859_4iso-8859-4,latin4,L4波罗的海语言
iso8859_5iso-8859-5, cyrillic保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
iso8859_6iso-8859-6,arabic阿拉伯
iso8859_7iso-8859-7,greek,greek8希腊语
iso8859_8iso-8859-8,hebrew希伯来语
iso8859_9iso-8859-9, latin5, L5土耳其
iso8859_10iso-8859-10,latin6,L6北欧语言
iso8859_11iso-8859-11泰语
iso8859_13iso-8859-13,latin7,L7波罗的海语言
iso8859_14iso-8859-14,latin8,L8凯尔特语
iso8859_15iso-8859-15,latin9,L9西欧
iso8859_16iso-8859-16,latin10,L10东南欧
johabcp1361,ms1361韩语
koi8_r俄语
koi8_t塔吉克
koi8_u乌克兰
kz1048kz_1048,strk1048_2002,rk1048哈萨克
mac_cyrillicmaccyrillic保加利亚语,白俄罗斯语,马其顿语,俄语,塞尔维亚语
mac_greekmacgreek希腊语
mac_icelandmaciceland冰岛的
mac_latin2maclatin2,maccentraleurope中欧和东欧
mac_romanmacroman,macintosh西欧
mac_turkishmacturkish土耳其
ptcp154csptcp154, pt154, cp154, cyrillic-asian哈萨克
shift_jiscsshiftjis,shiftjis,sjis,s_jis日本
shift_jis_2004shiftjis2004,sjis_2004,sjis2004日本
shift_jisx0213shiftjisx0213,sjisx0213,s_jisx0213日本
utf_32U32,utf32所有语言
utf_32_beUTF-32BE所有语言
utf_32_leUTF-32LE所有语言
utf_16U16,utf16所有语言
utf_16_beUTF-16BE所有语言
utf_16_leUTF-16LE所有语言
utf_7U7,unicode-1-1-utf-7所有语言
utf_8U8,UTF,utf8所有语言
utf_8_sig所有语言

python的特定编码

编解码器别名目的
idna实现 RFC 3490,另请参见encodings.idna。仅支持errors=‘strict’。
mbcsdbcsWindows only: Encode operand according to the ANSI codepage (CP_ACP)
palmosEncoding 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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值