1. 程式人生 > >python_request返回中文亂碼

python_request返回中文亂碼

POST從網頁中獲取資料,由於編碼問題,出現亂碼。

方法:

```

response = session.get('http://xxxx')
print(response.encoding)
response.encoding = 'utf-8'
print(response.json())

```

原因:

1.因為資料來源的編碼宣告不規範,導致 reuqests 無法判斷出返回資料的正確編碼,從而使用了它的預設編碼 iso8859-1 來將資料轉換為 unicode,沒使用正確的編碼 utf-8,於是就出現亂碼了。

解決辦法一就是手動設定返回資料的正確編碼:response.encoding = 'utf-8'。這樣結果就是正確的 unicode 型別字串。
或者將錯誤的 unicode 用同樣的 iso8859-1 編碼轉換回去原本的 utf-8 編碼的 str 型別字串:data.encode('iso8859-1')。

2.(沒明白,反正就這麼個意思吧。編碼真是個大坑!)Python中實際上有兩種字串,分別是str型別和unicode型別,這兩者都是basestring的派生類。str實際上相當於string, 而unicode則是標準的字串,相當於wstring。
其中I/O讀入的基本都是str型別,也就是說Python不關心這些位元組代表什麼含義。但是如果需要做真正的字串操作的時候,建議使用unicode型別,這樣確保不存在編碼問題。
JSON理論上應該可用ASCII完全表示,其中的寬字元用類似\u1111的形式表達。但是現在有很多不規範的JSON出現,例如s="""{"標題": "Hello, world"}"""。此時就需要你自己確定這部分內容用位元組表達時,究竟用了什麼編碼,如果是UTF-8,那麼就首先s_u = s.decode("UTF-8")變成unicode字串。

另一方面,只要保證這段字串的編碼和Python執行時環境的編碼保持一致,也是可以直接loads(str型別變數)的。例如Linux下如果LANG是UTF-8,那麼python屁顛屁顛跑著的時候就可以直接把UTF-8編碼的JSON串塞進去。