python中的编码和解码及\\x和\\u问题

目录

编码和解码及\\x和\\u问题

“字符在内存里的表示是unicode,如果要存盘或者发到网络就经过utf-8,然后对端收到依次解码。”

Python 3里面,str在内存里是unicode表示的

‘中文’ == ‘\\u4e2d\\u6587’

\'中文\'.encode(\'utf-8\')
b\'\\xe4\\xb8\\xad\\xe6\\x96\\x87\'
 \'\\u4e2d\\u6587\'.encode(\'utf-8\')
b\'\\xe4\\xb8\\xad\\xe6\\x96\\x87\'

1个汉字用unicode表示一般是2个byte,

例如:

‘中’=\\u4e2d(十六进制写法【即2bytes】)

\'A\'.encode(\'ascii\')
>>>b\'A\'
(\'\\u0041\').encode(\'ascii\')
>>>b\'A\'
\'A\'.encode(\'utf-8\')
>>>b\'A\'

note: b’A’和’A’

在python 3中

b’A’是ascii编码的01010101的字节,占1个byte;

'A‘是在内存里按unicode形式编码的/ucc,占的是2个byte。

unicode编码后是bytes,如果这个字节范围不在ascii的表示范围内,就会显示成\\x(十六进制形式)

例如:

  • 汉字编码成bytes,去查看这个bytes肯定只能看到\\x系列,因为这个bytes的内容肯定不在ascii范围内;
  • 英文编码成bytes可以看到对应的英文字母,本质上它还是没有含义的010101的字节流而不是字符。
\"abc\".encode(\'utf-8\')
b\'abc\'
\'中文\'.encode(\'utf-8\')
b\'\\xe4\\xb8\\xad\\xe6\\x96\\x87\'
1个汉字,按utf-8编码,一般是3个bytes,\\xe4是十六进制表示的1个byte。

相同的英文字符,ascii编码和utf-8编码的结果是一致的,因为这两种编码都使用一个byte表示一个英文字符

\'abc\'.encode(\'ascii\').decode(\'utf-8\')
\'abc\'

可以用一个编码然后再另一个解码,是可以成功还原的。但一般是不会这么做的。

ord函数获取字符的整数表示和chr数把编码转换为对应的字符

 ord(\'A\')
65
ord(\'中\')
20013
chr(66)
\'B\'
chr(25991)
\'文\'

对str和对bytes用len,意义是不同的。

len(str)统计字符数,len(bytes)统计bytes数

>>> len(\'中文\')
2
 len(str)统计字符数
>>> bt1 = \'中文\'.encode(\'gb2312\')
>>> bt2 = \'中文\'.encode(\'utf-8\')
>>> bt1
b\'\\xd6\\xd0\\xce\\xc4\'
>>> bt2
b\'\\xe4\\xb8\\xad\\xe6\\x96\\x87\'
>>> len(bt1)
4
>>> len(bt2)
6

以Unicode表示的str通过encode()方法可以编码为指定的bytes

python解析 \\x 和 \\u "乱码"

参数错误

\\xe5\\x8f\\x82\\xe6\\x95\\xb0\\xe6\\x9c\\x89\\xe8\\xaf\\xaf  

今日已经完成过此任务,请明日再做此任务吧!

\\u4eca\\u65e5\\u5df2\\u7ecf\\u5b8c\\u6210\\u8fc7\\u6b64\\u4efb\\u52a1\\uff0c\\u8bf7\\u660e\\u65e5\\u518d\\u505a\\u6b64\\u4efb\\u52a1\\u5427!

python2.7解析方法

>>> print(u\'\\xe5\\x8f\\x82\\xe6\\x95\\xb0\\xe6\\x9c\\x89\\xe8\\xaf\\xaf  \'.encode(\'unicode_escape\').decode(\'string_escape\')) 
>>>print(\'\\u4eca\\u65e5\\u5df2\\u7ecf\\u5b8c\\u6210\\u8fc7\\u6b64\\u4efb\\u52a1\\uff0c\\u8bf7\\u660e\\u65e5\\u518d\\u505a\\u6b64\\u4efb\\u52a1\\u5427!\'.decode(\'unicode_escape\'))

python3解析方法

>>>(\'\\xe5\\x8f\\x82\\xe6\\x95\\xb0\\xe6\\x9c\\x89\\xe8\\xaf\\xaf  \'.encode(\'raw_unicode_escape\')).decode()
>>>\'\\u4eca\\u65e5\\u5df2\\u7ecf\\u5b8c\\u6210\\u8fc7\\u6b64\\u4efb\\u52a1\\uff0c\\u8bf7\\u660e\\u65e5\\u518d\\u505a\\u6b64\\u4efb\\u52a1\\u5427!\'

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容