Python str decode---error

本文通过解决一个具体的Python编码问题,详细介绍了Python中字符串编码的工作原理,包括如何处理不同编码的字符串,以及如何在Python3中正确地使用decode和encode方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是最近在做一道类似平台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中文处理精解

转载于:https://www.cnblogs.com/bay1/p/10982318.html

当使用 `requests` 库中的 `.json()` 方法解析 HTTP 响应时,如果返回的内容不是合法的 JSON 格式,则会引发 `JSONDecodeError` 异常。以下是针对该问题的具体分析和解决方案: ### 1. 错误的根本原因 `JSONDecodeError` 表明服务器返回的数据无法被正确解析为 JSON 格式。这可能是由于以下原因之一引起的: - **响应内容为空**:服务器可能未返回任何有效数据[^1]。 - **响应内容非 JSON 格式**:例如 HTML 页面或其他类型的文本[^2]。 - **JSON 字符串格式错误**:如缺少双引号、非法字符转义等问题[^3]。 --- ### 2. 解决方案 #### (1)验证响应状态码 在调用 `.json()` 方法之前,先检查请求的状态码是否正常(通常是 200)。如果状态码异常,说明请求本身存在问题,需进一步排查。 ```python import requests url = "http://example.com/api/data" response = requests.get(url) if response.status_code != 200: raise Exception(f"Request failed with status code {response.status_code}") ``` #### (2)确认响应内容不为空 即使状态码为 200,也可能存在空响应的情况。因此需要额外判断响应体是否为空。 ```python if not response.text.strip(): raise ValueError("Response content is empty or contains only whitespace.") ``` #### (3)捕获并处理异常 通过 `try-except` 结构来优雅地处理潜在的解码失败情况,并提供详细的错误信息以便调试。 ```python try: data = response.json() except json.JSONDecodeError as e: error_message = f"Failed to decode JSON: {str(e)}. Response text was: {response.text}" print(error_message) # 可在此处记录日志或采取其他措施 except ValueError as ve: print(f"ValueError occurred while decoding JSON: {ve}.") ``` #### (4)检查实际返回值 某些接口可能会在特定条件下返回非 JSON 的内容(比如错误页面),建议打印原始响应以帮助定位问题。 ```python print(response.headers['Content-Type']) # 查看 Content-Type 是否为 application/json print(response.text) # 打印完整的响应字符串供审查 ``` #### (5)确保输入数据合法性 对于本地测试或者手动构造的 JSON 数据,务必遵循标准语法——键名需要用双引号包裹;避免多余的逗号等常见陷阱[^4]。 --- ### 3. 完整示例代码 下面是一个综合上述要点的安全版 JSON 请求脚本: ```python import requests import json def fetch_and_parse_json(url, params=None, headers=None): try: response = requests.get(url, params=params, headers=headers) if response.status_code != 200: raise Exception(f"HTTP Error {response.status_code}: {response.reason}") if not response.text.strip(): raise ValueError("The server returned an empty response.") if 'application/json' not in response.headers.get('content-type', '').lower(): raise TypeError("Expected a JSON response but received something else.") parsed_data = response.json() return parsed_data except json.JSONDecodeError as je: print(f"JSON Decode Failed: {je}\nRaw Data Received:\n{response.text[:200]}...") except Exception as ex: print(f"An unexpected error occurred: {ex}") # Example Usage url = 'https://movie.douban.com/j/chart/top_list' params = { 'type': '24', 'interval_id': '100:90', 'action': '', 'start': '1', 'limit': '20' } headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)' } result = fetch_and_parse_json(url, params, headers) if result: print(result) else: print("No valid JSON could be retrieved.") ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值