2

GMAIL に接続して電子メールのテキストを出力するスクリプトを Python で作成しました...しかし、多くの場合、私の電子メールには「アクセント」のある単語が含まれています。そして、私の問題があります...

たとえば、「PLANO DE S=C3=9ADE」というテキストは、「PLANO DE SAÚDE」と印刷する必要があります。

メール本文を読みやすくするにはどうすればよいですか? これらの文字をアクセント付きで変換するには何を使用できますか?

ありがとう、


Andrey が提案したコードは、Windows では正常に動作しますが、Linux ではまだ間違った出力が得られます。

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÃDE

ラファエル、

ありがとう、あなたは単語について正しいです、それはつづりが間違っていました。しかし、問題はここでも同じです。別の例: 正しい単語: obersevação

>>> b = 'Observa=C3=A7=C3=B5es'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
Observações

UTF-8 ロケールで Debian を使用しています。

>>> :~$ locale
LANG=en_US.UTF-8

アンドレイ、

御時間ありがとうございます。私はあなたの説明に同意しますが、ここでも同じ問題があります。私のテストを見てください:

   s='Observa=C3=A7=C3=B5es'
   s2= s.decode('quopri').decode('utf-8')

   >>> print s

   Observa=C3=A7=C3=B5es

   >>> print s2

   Observações

   >>> import locale

   >>> ENCODING = locale.getpreferredencoding()

   >>> print s.encode(ENCODING)
   Observa=C3=A7=C3=B5es

   >>> print s2.encode(ENCODING)
   Observações

   >>> print ENCODING
   UTF-8
4

2 に答える 2

4

このエンコーディングは Quoted-printable と呼ばれます。あなたの例ではunicode、UTF-8 バイト (Python のstr) でエンコードされた文字列 (Python の ) が、引用符で囲まれた印刷可能なバイトでエンコードされています。したがって、文字列値を取得する正しい方法は次のとおりです。

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE

更新:ただし、コンソールのコンディングに問題がある可能性があります。s完全に正しい Unicode 文字列値 (Python タイプunicode) を保持します。ただし、ステートメントを使用する場合、 OS ファイル記述子番号(標準出力パイプ)に書き込むためにprint、値をバイト (Python の ) に変換する必要があります。そのため、ステートメントの実装はコンソールのエンコーディングをチェックし、いくつかの推測を行って結果を出力します。実際、Python 2 では、インタラクティブ シェルからの印刷、プロセスの非インタラクティブな実行、および出力をファイルにリダイレクトしながらプロセスの実行の結果が異なります。str1print

Python 2 でエンコードされた文字列を出力する最良の方法は、合意されていません。最も理にかなっている 2 つの方法は次のとおりです。

1)localeのエンコーディング推測を使用し、文字列を手動でエンコードします。

import locale
ENCODING = locale.getpreferredencoding()

print s.encode(ENCODING)

2) エンコード オプション (コマンドライン、ハードコードなど) を使用します。

from getopt import getopt
ENCODING = 'UTF-8'
opts, args = getopt(sys.argv[1:], '', ['encoding='])
for opt, arg in opts:
    if opt == '--encoding':
        ENCODING = arg

print s.encode(ENCODING)

更新 2:何も解決せず、コンソールのエンコーディングとフォントが UTF-8 に設定されていることが確実な場合は、次のことを試してください。

import sys, os
ENCODING = 'UTF-8'
stdout = os.fdopen(sys.stdout.fileno(), 'wb')
s = u'привет' # Don't forget to use a Unicode literal staring with u''
stdout.write(s.encode(ENCODING))

この時点で、コンソールにキリル文字セットでロシア語が表示されているはずです:)привет

この場合、stdout通常の代わりにこのバイナリを使用する必要がありますsys.stdout

于 2010-09-09T20:40:06.147 に答える
0

あなたの文字列は間違っています、見てください:

'PLANO DE S=C3=9ADE' == 'PLANO DE S\xc3\x9aDE'

SAÚDE で欠落している「A」はどこにありますか?

quoted-printable としてデコードする'PLANO DE S=C3=9ADE'と、'PLANO DE SÚDE' のみが得られます。

このコードを Linux (Ubuntu 9.10) で実行すると、次のようになります。

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
于 2010-09-10T18:31:11.283 に答える