質問

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

たとえば、「Plano de s = c3 = 9ade」を「plano desaú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
役に立ちましたか?

解決

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

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

アップデート: ただし、コンソールの条件にはいくつかの問題があるかもしれません。 s 完全に正しいユニコード文字列値を保持します(Pythonタイプの unicode)。しかし、あなたが使用するとき print 声明、値 しなければならない バイト(python'sに変換されます str)OSファイル記述子番号に書き込まれるために 1 (標準出力パイプ)。だから print ステートメントの実装は、コンソールのエンコードをチェックし、いくつかの推測を行い、結果を印刷します。実際、Python 2では、インタラクティブシェルからの印刷、プロセスを非対話的に実行し、出力をファイルにリダイレクトしながらプロセスを実行すると、結果が異なります。

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.

他のヒント

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

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

Saúdeの「A」が行方不明の「A」はどこにありますか?

デコードする場合 'PLANO DE S=C3=9ADE' 引用された印刷可能なものとして、「Plano deSúde」のみが得られます。

ここでこのコードをLinuxで実行しています(Ubuntu 9.10):

>>> b = 'PLANO DE S=C3=9ADE'
>>> s = b.decode('quopri').decode('utf-8')
>>> print s
PLANO DE SÚDE
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top