Loading

Python str decode---error

这是最近在做一道类似平台fast题目时遇到的坑,python?中文?字符串?

作者环境python3,IDE:PyCharm,小生总结,有错误请指教

首先说一下这道题,下面是所需要的脚本代码(正则部分不是我写的,是道长,虽然很简单,但是我还不会)

	# coding:utf-8
	import requests
	import base64
	import re
	url='http://c.bugku.com/web6/'
	a=requests.session()
	r=a.get(url)
	FLAG=r.headers['flag']
	p=re.match('(.*)(: )(.*)',(base64.b64decode(FLAG)).decode())
	payload={'margin':base64.b64decode(p.group(3))}
	r=a.post(url,data=payload)
	print(r.text)

而最初其中的一部分代码是这样的

	p=re.match('(.*)(: )(.*)',(base64.b64decode(FLAG)))

它的报错是这样的
str error-1

在询问了组长之后,才明白这牵涉到了python 字符串的问题
首先FLAG经过base64解码之后是这样的形式:跑的还不错,给你flag吧: MjY4NTMy
在PyCharm输出是这样的:b'\xe8\xb7\x91\xe7\x9a\x84\xe8\xbf\x98\xe4\xb8\x8d\xe9\x94\x99\xef\xbc\x8c\xe7\xbb\x99\xe4\xbd\xa0flag\xe5\x90\xa7: MjY4NTMy'
很明显前段部分,正则是没法直接处理的,这样就需要先把这段东东decode为python内部表示的unicode编码,再进行操作

这样报错的原因呢,我也搜到了大多数的说法。程序本身并没有错,是IDE的错
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码
查看系统的编码方式可以用下列代码(我也测试了一下我的,是utf-8):

	#!/usr/bin/env python
	#coding=utf-8
	import sys
	print sys.getdefaultencoding()

然后,在此机会下,也复习了一下python字符串编码的问题

因为python内部编码是unicode,所以一般在做编码转换时,通常需要以unicode作为中间编码
就是说先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码
具体的方式可以参考下面的代码

	test=test.decode('gb2312').encode('utf-8')

即:decode首先把gb2312编码的test用decode搞成unicode,然后再用encode编码成utf-8

而我们用到的decode()实际上涉及到一个隐式的类型转化,decode()相当于str.decode(sys.defaultencoding).encode()
sys.defaultencoding这个东东就很明显了,在上面

  • 一位前辈的总结

在Python3中的str(Python2中的unicode),它是统一码,没有某种具体形式,所以只能被某种具体形式编码
只能调用encode,而不能调用decode,同样,Python3中的bytes对象,如b’\xe9\xa9\xb9’(UTF-8编码形式的’驹’字)
已经具备某种具体编码,只能被解码还原成unicode统一码,所以它之只能调用decode方法,调用encode会报错

字符串编码真的让人头疼啊。。。

关于字符串的链接:阮一峰字符编码笔记
字符编码及Python中文处理精解

posted @ 2017-04-23 00:54  bay1  阅读(458)  评论(0编辑  收藏  举报