【问题标题】:Url is encoded in UTF-8 but Python is trying to read it as cp1256Url 以 UTF-8 编码,但 Python 试图将其读取为 cp1256
【发布时间】:2018-06-08 21:24:03
【问题描述】:

我正在尝试运行此代码:

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?

【问题讨论】:

  • 这对我来说很好
  • @Simon 这适用于我在 python3 上。我得到了巨大的响应。
  • @Simon 你们都用mac吗?我的一个朋友也在完美运行它。唯一不同的是他用的是mac,我用的是windows。
  • @PurexedPose 不,我在 Windows 上运行 Python 3.6(如果你运行的是 2.7 可能会解释它)
  • @Simon,太奇怪了。我正在运行 3.5

标签: python windows request cp1252


【解决方案1】:

要确保字符串的 unicode 被正确转换,您可以使用 the unidecode module

然而,在这里,python 认为你的字符串中有一个特殊字符('\u0e3f' 是 Unicode 字符'THAI CURRENCY SYMBOL BAHT',

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

【讨论】:

    【解决方案2】:

    检索到的 JSON 是正确的,问题与 URL 检索或 JSON 转换无关。问题是通过print 的终端输出。在 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'
    

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 2013-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 2011-10-26
      相关资源
      最近更新 更多