zoukankan      html  css  js  c++  java
  • 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'xe8xb7x91xe7x9ax84xe8xbfx98xe4xb8x8dxe9x94x99xefxbcx8cxe7xbbx99xe4xbdxa0flagxe5x90xa7: 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’xe9xa9xb9’(UTF-8编码形式的’驹’字)
    已经具备某种具体编码,只能被解码还原成unicode统一码,所以它之只能调用decode方法,调用encode会报错

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

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

  • 相关阅读:
    蜗牛爱课 -- iOS 设计模式之模板模式
    蜗牛爱课- iOS中plist的创建,数据写入与读取
    蜗牛爱课 - iOS7、8模态半透明弹出框
    UIScrollView的属性总结
    简述UITextField的属性和用法
    IOS开发 统计XCODE 代码行数
    当xcode里点运行出现treating unicode character as whites
    Your build settings specify a provisioning profile with the UUID, no such provisioning profile was found的解决方案
    CocoaPods安装和使用教程
    蜗牛爱课- CGAffineTransformMakeRotation 实现一张图片的自动旋转
  • 原文地址:https://www.cnblogs.com/bay1/p/10982318.html
Copyright © 2011-2022 走看看