httpx 字符集编码和自动检测
当访问response.text
时,我们需要将响应字节解码为unicode文本表示。
默认情况下,httpx
将使用响应Content-Type
头中包含的charset
信息来确定如何将响应字节解码为文本。
在响应中不包含字符集信息的情况下,默认行为是采用utf-8
编码,这是迄今为止互联网上使用最广泛的文本编码。
使用默认编码
为了更好地理解这一点,让我们从查看文本解码的默认行为开始...
import httpx
# 使用默认配置实例化client
client = httpx.Client()
# 使用client...
response = client.get(...)
print(response.encoding) # 这将打印 Contnet-Type 中charset给定的字符集,或者打印“utf-8”
print(response.text) # 文本将使用Content-Type中charset设定的字符集进行解码,或使用“utf-8”。
这通常是绝对没问题的。大多数服务器将使用格式正确的 Content-Type 标头(包括字符集编码)进行响应。在不包含字符集编码的大多数情况下,UTF-8很可能被使用,因为它被广泛采用。
使用显式编码
在某些情况下,我们可能会向服务器未显式设置字符集信息的站点发出请求,但我们知道编码是什么。在这种情况下,最好在client上显式设置默认编码。
import httpx
# 使用中文字符集作为默认编码实例化client。
client = httpx.Client(default_encoding="GBK")
# 使用client...
response = client.get(...)
print(response.encoding) # 这将打印 Contnet-Type 中charset给定的字符集,或者打印“GBK”
print(response.text) # 文本将使用Content-Type中charset设定的字符集进行解码,或使用“GBK”。
使用字符集自动检测
如果服务器不能可靠地包含字符集信息,并且我们不知道正在使用哪种编码,我们可以启用自动检测,以便在从字节解码为文本时进行最佳猜测尝试。
若要使用自动检测,需要将default_encoding
参数设置为可调用参数而不是字符串。这个可调用的应该是一个函数,它将输入字节作为参数,并返回用于将这些字节解码为文本的字符集。
有两个广泛使用的Python包都可以处理此功能:
- chardet - 这是一个成熟的软件包,是Mozilla中自动检测代码的端口。
- charset-normalizer - 较新的包,由
chardet
激发,采用不同的方法。
让我们看一下如何使用这些软件包之一安装自动检测...
pip install chardet
安装后,我们可以将Client配置为使用chardet字符集自动检测。
import httpx
import chardet
def autodetect(content):
return chardet.detect(content).get("encoding")
# Using a client with character-set autodetection enabled.
client = httpx.Client(default_encoding=autodetect)
response = client.get(...)
print(response.encoding) # 这将打印内容类型字符集中给定的字符集,或者打印自动检测的字符集。
print(response.text)