簡體   English   中英

用口音閱讀文本-Python

[英]Reading Text with Accent - Python

我在python中做了一些腳本,可以連接到GMAIL並打印電子郵件文本。但是,通常我的電子郵件中帶有“重音”字樣。 還有我的問題...

例如,我得到的文本“ 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

這種編碼稱為加引號可打印。 在您的示例中,您有一個以UTF-8字節(Python的str )編碼的字符串(Python的unicode ),該字符串以帶引號的可打印字節編碼。 因此,獲取字符串值的正確方法是:

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

更新:控制台編譯可能會出現一些問題。 s擁有完全正確的Unicode字符串值(Python類型unicode )。 但是,當您使用print語句時, 必須將該值轉換為字節(Python的str )才能寫入OS文件描述符編號1 (標准輸出管道)。 因此, print語句實現會檢查您的控制台編碼,然后進行一些猜測並輸出結果。 實際上,在Python 2中,從交互式外殼程序進行打印,以非交互方式運行過程以及將輸出重定向到文件時運行過程的結果將有所不同。

尚未商定在Python 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”在哪里?

如果將'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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM