带有口音的文字 - python
-
02-10-2019 - |
题
我在Python中做了一些脚本,这些脚本连接到Gmail并打印了电子邮件文本...但是,我的电子邮件通常带有“ Accent”的单词。还有我的问题...
例如,我得到的文本:“ 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
我正在将Debian与UTF-8语言环境一起使用:
>>> :~$ 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的 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
拥有一个完全正确的Unicode字符串值(Python类型的 unicode
)。但是当您使用 print
声明,价值 必须 转换为字节(Python's 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