httpx 字符集編碼和自動檢測

2022-07-26 11:40 更新

當訪問?response.text?時,我們需要將響應字節(jié)解碼為unicode文本表示。

默認情況下,?httpx?將使用響應?Content-Type?頭中包含的?charset?信息來確定如何將響應字節(jié)解碼為文本。

在響應中不包含字符集信息的情況下,默認行為是采用utf-8?編碼,這是迄今為止互聯(lián)網上使用最廣泛的文本編碼。

使用默認編碼

為了更好地理解這一點,讓我們從查看文本解碼的默認行為開始...

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”。

這通常是絕對沒問題的。大多數(shù)服務器將使用格式正確的 Content-Type 標頭(包括字符集編碼)進行響應。在不包含字符集編碼的大多數(shù)情況下,UTF-8很可能被使用,因為它被廣泛采用。

使用顯式編碼

在某些情況下,我們可能會向服務器未顯式設置字符集信息的站點發(fā)出請求,但我們知道編碼是什么。在這種情況下,最好在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”。

使用字符集自動檢測

如果服務器不能可靠地包含字符集信息,并且我們不知道正在使用哪種編碼,我們可以啟用自動檢測,以便在從字節(jié)解碼為文本時進行最佳猜測嘗試。

若要使用自動檢測,需要將?default_encoding?參數(shù)設置為可調用參數(shù)而不是字符串。這個可調用的應該是一個函數(shù),它將輸入字節(jié)作為參數(shù),并返回用于將這些字節(jié)解碼為文本的字符集。

有兩個廣泛使用的Python包都可以處理此功能:

讓我們看一下如何使用這些軟件包之一安裝自動檢測...

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)


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號