【问题标题】:Unicode error Python3 calendar moduleUnicode 错误 Python3 日历模块
【发布时间】:2015-12-23 08:53:51
【问题描述】:

我正在尝试从 python calendar 模块打印一个简单的日历:

import calendar

c = calendar.LocaleTextCalendar(0, 'Russian')
s = c.formatmonth(2016, 5)
print(s)

在 linux 上运行良好,但在 Windows 上出现错误: UnicodeEncodeError: 'charmap' codec can't encode characters in position 4-10: character maps to <undefined>

为了避免该错误,我所能做的就是print(s.encode('ascii', 'replace').decode('ascii'))(缺少区域设置文本值),所以我对常见的好解决方案很感兴趣。

提前致谢。

【问题讨论】:

    标签: python python-3.x unicode encoding console


    【解决方案1】:

    这是因为 Windows 控制台编码不是 Unicode。不幸的是,这不是微不足道的,有几种方法可以解决这个问题。

    您的控制台的编码是什么?你可以通过这种方式在 Python 中找到

    import sys
    sys.stdin.encoding
    

    您可以尝试为当前控制台设置 Unicode:

    chcp 65001
    python myScript.py
    

    在您的脚本中,确保您的字符串编码为 UTF-8。

    【讨论】:

    • 没有。将字体更改为 Lucida Console 也无济于事。
    • 顺便说一句,我使用print(s),因为str没有decode方法。
    • 不幸的是,我不欠一台 Windows 机器。我只能假设控制台编码有问题。日历输出 utf-8,你的控制台编码现在应该是 utf-8。
    • 不幸的是,Windows 控制台中存在严重且长期存在的错误,这些错误会破坏代码页 65001。如果您确实必须将 Unicode 打印到 Windows 控制台,则必须使用 Win32 WriteConsoleW API 作为解决方法.有关执行此操作的 Python 模块,请参阅 win-unicode-console
    • 在不同的控制台窗口中运行python脚本可能更容易(比如IDLE,可以很好地处理这段代码)?
    【解决方案2】:

    我解决了以下问题:

    import platform
    
    if platform.system() == 'Windows':
        import locale
        locale.setlocale(locale.LC_ALL, "Russian")
    
    ...
    print(s) # Works!
    

    另一种选择是在打印内编码/解码:

    print(s.encode('cp1252').decode('cp1251'))
    

    这两种情况也适用于文件输出。

    【讨论】:

      猜你喜欢
      • 2018-11-12
      • 2015-01-27
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多