簡體   English   中英

非拉丁文本在Python中輸出為無意義

[英]Non-latin text outputting as nonsense in Python

我有一個腳本,它生成一個JSON請求,可以在任何腳本中返回文本,然后輸出文本(我沒有對正在返回的文本的任何控制)。

它適用於拉丁字符,但其他腳本輸出為mojibake,我不知道出了什么問題。

在響應中,有問題的字符使用\\ u語法編碼。 特別是,我有一個包含\Ð\¸\Ñ\\Ð\¿\Ñ\‹\Ñ\‚\Ð\°\Ð\½\Ð\¸\Ð\µ應該輸出為испытание但是而是輸出為иÑпÑÑание

顯然這與python如何處理unicode和UTF有關,但是盡管我已經讀過,但我不明白發生了什么,知道如何解決它。

我試圖從下面的代碼中提取突出點:

response = requests.get(url, params=params, cookies=self.cookies, auth=self.auth)
text = response.text
print text
status = json.loads(text)
print status
for folder in status['folders']
  print folder['name']

輸出:

{ "folders": [ { "name": "\u00d0\u00b8\u00d1\u0081\u00d0\u00bf\u00d1\u008b\u00d1\u0082\u00d0\u00b0\u00d0\u00bd\u00d0\u00b8\u00d0\u00b5" } ] }

{u'folders': [{ u'name': u'\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5' }]}

иÑпÑÑание

我也試過了

status = response.json();
for folder in status['folders']:
    print folder['name']

結果相同。

注意,我實際上是將字符串傳遞給要顯示的GTKMenuItem,但是print字符串的輸出與在菜單中顯示它的輸出相同。

正如@RicardoCárdenes在評論中所說,服務器發送錯誤的響應。 您獲得的響應是​​雙重編碼的:

>>>> u = u'\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5'
>>>> print u.encode('latin-1').decode('utf-8')
испытание

正確的字符串看起來像:

>>>> s = {u"name": u"испытание"}
>>>> import json
>>>> print json.dumps(s)
{"name": "\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435"}

>>>> print s['name']
испытание
>>>> print s['name'].encode('unicode-escape')
\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435
>>>> print s['name'].encode('utf-8')
испытание
>>>> s['name'].encode('utf-8')
'\xd0\xb8\xd1\x81\xd0\xbf\xd1\x8b\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM