1

我正在尝试运行此代码:

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,但 python 正在尝试读取 cp1252。有没有办法让 python 使用 utf8.py 而不是 cp1252.py?

PS,我的一个朋友可以在他的 MAC 上完美地运行这段代码。这更像是Windows问题而不是python问题吗?

4

2 回答 2

0

要确保正确转换字符串的 unicode,您可以使用unidecode 模块

但是,在这里,python 认为您的字符串中有一个特殊字符(' \u0e3f' 是 Unicode 字符 'THAI CURRENCY SYMBOL BAHT',在此处输入图像描述

您可以尝试以下方法吗?:将您的代码重新输入到一个新的 python 文件不要复制粘贴)并重试。这可能与其中一个字符与您的想法不同(例如 getAllAsset 中的 A 可能是希腊语 A 等)有关。有时您的编辑器显示的刺痛并且您认为存储的不是您的想法。它只是看起来一样/差异在您的编辑器中是不可见的,这可能是调试的恶魔......

于 2018-06-08T22:33:50.177 回答
0

检索到的 JSON 是正确的,问题与 URL 检索或 JSON 转换无关。问题是通过终端输出print。Pre-Python 3.6 将 Unicode 字符串打印到终端会在 Windows 上以终端的编码对输出进行编码,因此UnicodeEncodeError. 例如,美国 Windows 命令提示符默认为cp437

C:\>chcp
Active code page: 437

在 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 上打印字符使用控制台 Unicode API,并忽略代码页:

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 被打印为转义码。

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'
于 2018-06-08T22:57:40.740 回答