python decode报错_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)))

它的报错是这样的

b6370261d3b96d5ea38a603d49b2f596.png

在询问了组长之后,才明白这牵涉到了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会报错

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值