URL закодирован в UTF-8, но Python пытается прочитать его как cp1256 - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь запустить этот код:

import requests
resp = requests.get('https://www.binance.com/assetWithdraw/getAllAsset.html')
print(resp.json())

Но я получаю этот вывод в моей командной строке:

UnicodeEncodeError: 'charmap' codec can't encode character '\u0e3f' in 
position 2666: character maps to <undefined>

URL-адрес, который я пытаюсь прочитать, находится в UTF-8 но питон пытается прочитать cp1252.Есть ли способ заставить python использовать utf8.py вместо cp1252.py??

PS, мой приятель может без проблем выполнить этот код на своем MAC.Это скорее проблема с Windows, чем с python?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Полученный JSON верен, и проблема не имеет ничего общего с поиском URL или преобразованием JSON.Проблема в выводе терминала через print.При печати до Python 3.6 строк Unicode на терминал кодируется вывод в кодировке терминала в Windows, следовательно, UnicodeEncodeError.Например, в командной строке Windows для США по умолчанию установлено значение cp437:

C:\>chcp
Active code page: 437

В pre-Python 3.6 печать строки Unicode в терминале не удалась, если используются символы вне кодовой страницы.Обратите внимание, что он пытается использовать активную кодовую страницу терминала:

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print u'\N{EURO SIGN}'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u20ac' in position 0: character maps to <undefined>

В Python 3.6 печать символа в Windows использует API-интерфейсы консоли Unicode и игнорирует кодовую страницу:

Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print('\N{EURO SIGN}')
€

Чтобы обойти ошибку кодирования, в Python 3.x вы можете print(ascii(resp.json())) проверить, что ответ правильный.Python 2.x вы можете использовать print repr(resp.json()).Оба отображают только символы ASCII, а не-ASCII печатаются как escape-коды.

Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print repr(u'\N{EURO SIGN}')
u'\u20ac'
0 голосов
/ 09 июня 2018

Чтобы убедиться, что юникод строки правильно преобразован, вы можете использовать модуль unidecode

Здесь, однако, python думает, что в вашей строке есть специальный символ ('\u0e3f' - этосимвол Unicode 'THAI CURRENCY SYMBOL BAHT', enter image description here

Можете ли вы попробовать следующее ?: повторно введите код в новый файл Python (НЕ копируйте, не вставляйте ) и повторите попытку. Возможно, это связано с тем, что один из символов отличается от того, что вы думаете (например, буква A в getAllAsset может быть греческой буквой A и т. Д.)вы думаете, что хранится, а не то, что вы думаете. Это просто выглядит так же / разница невидима в вашем редакторе, и это может быть дьяволом для отладки ...

...