0

可能重复:
UnicodeDecodeError,无效的继续字节

我正在尝试在 python 生成的 PDF 中使用á和等字符。ô该程序使用 dateutil 模块(以及其他几个模块)生成 PDF 日历(带图像)。日历是用 Latex 设计的。

我的目标是用法语创建日历,但是法语中的月份名称数组包含 python 似乎无法识别的字符。

在生成过程中,程序SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xe9 in position 0: unexpected end of data在命令行中打印。

如何告诉 python 使用这些字符?

如果它有助于数组是:

FRENCH_MONTHS = [u'NotAMonth', u'Janvier', u'Février', u'Mars', u'Avril', u'Mai', u'Juin', u'Juillet', u'Aôut', u'九月',你'十月',你'十一月',你'十二月']

还使用:

  • MPS 到 PDF 转换器
4

2 回答 2

3

您必须指定用于创建 python 源的源编码。通过添加源编码声明来做到这一点:

# coding: UTF-8

这应该是 python 源文件的第一行或第二行。编码必须与您保存文件的编码相匹配;检查您的文本编辑器设置。您添加到问题中的错误消息表明编码不匹配,我怀疑您使用的是 latin-1 (ISO 8859-1)。

或者,使用 unicode 转义来包含非 ASCII 字符;u'\u00e9'将 a 中带有重音符号的 e 表示为 unicode 代码点。

请在Python Unicode HOWTO中研究 Python 如何处理 Unicode 。Joel Spolsky Unicode 文章对于任何处理任何非 ASCII 数据的软件开发人员来说也是必不可少的阅读材料。

于 2012-12-04T07:20:27.343 回答
2

# coding: UTF-8如果您的编辑器设置为使用正确的编码保存文件,您可以使用

或者,您也可以将字符编码为仅 ASCII 的转义序列。例如,转义序列é\u00E9

FRENCH_MONTHS = [u'NotAMonth', u'Janvier', u'F\u00E9vrier', ...]

这不太可能被配置不当的编辑器搞砸,但可以实现完全相同的效果。

更好的是,您可以使用该calendar模块并回避整个问题(基于此答案):

import calendar


def get_month_names(locale):
    with calendar.TimeEncoding(locale) as encoding:
        months = list(calendar.month_name)

        # Could do this to match original values:
        # months = [x.title() for x in months]

        if encoding is not None:
            months = [x.decode(encoding) for x in months]

        months[0] = u"NotAMonth"
        return months

FRENCH_MONTHS = get_month_names("fr_FR.UTF-8")

编辑:这与这个问题相同- 你的 é 用 编码latin 1,但你的 Python 源文件编码是 UTF-8(在 Python 2 中明确设置,或者因为它是 Python 3 中的默认值):

>>> print "\xe9".decode("latin1")
é
>>> print "\xe9".decode("utf-8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 0: unexpected end of data

使用上述替代解决方案之一的另一个很好的理由!

于 2012-12-04T07:50:49.710 回答