目录
编码和解码及\\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
暂无评论内容