如何在Python中去除字节顺序标记

5 投票
1 回答
6223 浏览
提问于 2025-04-18 12:00

这个问题和我之前报告的Stack Overflow API的一个最近变化有关,具体可以查看这里。在那个问题中,我得到了一个回复,看起来是可行的,但实际上我却无法让它正常工作。

这是我的代码:

import requests
import json
url="https://api.stackexchange.com/2.2/sites/?filter=%21%2AL1%2AAY-85YllAr2%29&pagesize=1&page=1"
response = requests.get(url)
response.text

这个代码的输出是:

u'\ufeff{"items":[{"site_state":"normal","api_site_parameter":"stackoverflow","name":"Stack Overflow"}],"has_more":true,"quota_max":300,"quota_remaining":294}'

开头的 u'\ufeff' 表示如果我执行 response.json(),就会出现 ValueError: No JSON object could be decoded 的错误。

我得到的建议是使用 decode('utf-8-sig')。不过,我似乎也无法让这个方法奏效:

尝试1:

response.text.decode('utf-8-sig')
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 0: ordinal not in range(128)

尝试2:

json.loads(response.text).decode('utf-8-sig')
ValueError: No JSON object could be decoded

那么,去掉开头的 u'\ufeff' 的正确方法是什么呢?

1 个回答

10

response.text 是一个Unicode对象,也就是说它已经被解码过了,所以你不能再对它进行解码。

你需要做的是告诉 response 对象应该使用哪种编码:

response = requests.get(url)
response.encoding = "utf-8-sig"
response.text

想了解更多背景信息,可以查看 这份文档

撰写回答