0

重複の可能性:
UnicodeDecodeError、無効な継続バイト

Python で生成された PDF でáやなどの文字を使用しようとしています。ôこのプログラムは、dateutil モジュール (およびその他のいくつか) を使用して、PDF カレンダー (画像付き) を生成します。カレンダーはラテックスでレイアウトされています。

私の目的は、フランス語でカレンダーを作成することですが、フランス語の月名の配列には、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' Septembre', u'Octobre', u'Novembre', u'Décembre']

また使用:

  • MPS から PDF へのコンバーター
4

2 に答える 2

3

Python ソースの作成に使用するソース エンコーディングを指定する必要があります。これを行うには、ソース エンコーディング宣言を追加します。

# coding: UTF-8

これは、Python ソース ファイルの 1 行目または 2 行目にある必要があります。エンコーディング、ファイルを保存したエンコーディングと一致する必要があります。テキストエディタの設定を確認してください。質問に追加したエラー メッセージは、エンコーディングが一致しないことを示しています。代わりに latin-1 (ISO 8859-1) を使用したと思われます。

または、Unicode エスケープを使用して非 ASCII 文字を含めます。u'\u00e9'Unicode コード ポイントとして、a のアクセント記号付きの e を表します。

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

上記の代替ソリューションのいずれかを使用するもう 1 つの正当な理由です。

于 2012-12-04T07:50:49.710 に答える