web-dev-qa-db-ja.com

utf-8でエンコードされた文字列の印刷

BeautifulSoupを使用してHTMLからテキストを抽出していますが、それを画面(またはファイル)に適切に印刷する方法がわかりません。

テキストを含むクラスは次のようになります。

class Thread(object):
    def __init__(self, title, author, date, content = u""):
        self.title = title
        self.author = author
        self.date = date
        self.content = content
        self.replies = []

    def __unicode__(self):
        s = u""

        for k, v in self.__dict__.items():
            s += u"%s = %s " % (k, v)

        return s

    def __repr__(self):
        return repr(unicode(self))

    __str__ = __repr__

Threadのインスタンスを印刷しようとすると、コンソールに次のように表示されます。

~/python-tests $ python test.py
u'date = 21:01 03/02/11 content =  author = \u05d3"\u05e8 \u05d9\u05d5\u05e0\u05d9 \u05e1\u05d8\u05d0\u05e0\u05e6\'\u05e1\u05e7\u05d5 replies = [] title = \u05de\u05d1\u05e0\u05d4 \u05d4\u05de\u05d1\u05d7\u05df '

どんなことを試しても、希望する出力を取得できません(上記のテキストはヘブライ語である必要があります)。私の最終目標は、Threadをファイルにシリアル化し(jsonまたはpickleを使用)、それを読み戻すことができるようにすることです。

Ubuntu 10.10でPython 2.6.6を使用してこれを実行しています。

27
daniel

Unicode文字列をファイル(またはコンソール)に出力するには、テキストエンコーディングを選択する必要があります。 PythonデフォルトのテキストエンコーディングはASCIIですが、ヘブライ語の文字をサポートするには、UTF-8などの別のエンコーディングを使用する必要があります。

s = unicode(your_object).encode('utf8')
f.write(s)
24
Mark Byers

@markの答えに代わる良い方法は、環境変数PYTHONIOENCODING=UTF-8

c.fPythonでsys.stdoutを介してUnicode文字列を記述する

(Pythonスクリプト内ではない)を開始する前に必ず設定してください。)

11
Nir Levy