アクセントでテキストを読む-Python
-
02-10-2019 - |
質問
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