使用Python发送桌面通知时出现Unicode编码问题

时间:2016-09-05 11:33:18

标签: python unicode utf-8 ascii

我从网站上获取最新的足球比分并在桌面上发送通知(OS X)。我正在使用BeautifulSoup来抓取数据。我遇到了生成此错误的unicode数据的问题

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128). 

所以我在开头插入了这个,在终端输出时解决了问题。

import sys 
reload(sys)
sys.setdefaultencoding('utf-8') 

但是当我在桌面上发送通知时,问题就存在了。我使用terminal-notifier发送桌面通知。

def notify (title, subtitle, message):
    t = '-title {!r}'.format(title)
    s = '-subtitle {!r}'.format(subtitle)
    m = '-message {!r}'.format(message)
    os.system('terminal-notifier {}'.format(' '.join((m, t, s))))

以下图像描述终端上的输出与桌面通知的对比。

终端输出。

enter image description here

桌面通知

Dektop Notification

另外,如果我尝试替换字符串中的逗号,我会收到错误

new_scorer = str(new_scorer[0].text).replace(",","")

File "live_football_bbc01.py", line 41, in get_score
    new_scorer = str(new_scorer[0].text).replace(",","")
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)

如何在终端上获得桌面通知的输出?谢谢!

编辑:桌面通知的快照。 (已解决)

enter image description here

2 个答案:

答案 0 :(得分:1)

您正在使用!r进行格式化,它会为您提供 repr 输出,忘记可怕的重新加载逻辑,并在任何地方使用unicode:

def notify (title, subtitle, message):
    t = u'-title {}'.format(title)
    s = u'-subtitle {}'.format(subtitle)
    m = u'-message {}'.format(message)
    os.system(u'terminal-notifier {}'.format(u' '.join((m, t, s))))

或编码:

def notify (title, subtitle, message):
    t = '-title {}'.format(title.encode("utf-8"))
    s = '-subtitle {}'.format(subtitle.encode("utf-8"))
    m = '-message {}'.format(message.encode("utf-8"))
    os.system('terminal-notifier {}'.format(' '.join((m, t, s))))

当您调用 str(new_scorer [0] .text).replace(“,”,“”)时,您尝试编码为 ascii ,您需要指定要使用的编码:

In [13]: s1=s2=s3= u'\xfc'

In [14]: str(s1) # tries to encode to ascii
---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-14-589849bdf059> in <module>()
----> 1 str(s1)

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 0: ordinal not in range(128)

In [15]: "{}".format(s1) + "{}".format(s2) + "{}".format(s3) # tries to encode to ascii---------------------------------------------------------------------------
UnicodeEncodeError                        Traceback (most recent call last)
<ipython-input-15-7ca3746f9fba> in <module>()
----> 1 "{}".format(s1) + "{}".format(s2) + "{}".format(s3)

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 0: ordinal not in range(128)

您可以立即编码:

In [16]: "{}".format(s1.encode("utf-8")) + "{}".format(s2.encode("utf-8")) + "{}".format(s3.encode("utf-8"))
Out[16]: '\xc3\xbc\xc3\xbc\xc3\xbc'

或者使用所有unicode前缀u格式字符串并编码last:

In [17]: out = u"{}".format(s1) + u"{}".format(s2) + u"{}".format(s3)
In [18]: out
Out[18]: u'\xfc\xfc\xfc'

In [19]: out.encode("utf-8")
Out[19]: '\xc3\xbc\xc3\xbc\xc3\xbc'

如果使用!r,则总是要输出输出中的字节:

In [30]: print "{}".format(s1.encode("utf-8"))
ü

In [31]: print "{!r}".format(s1).encode("utf-8")
u'\xfc'

您还可以使用子进程传递args:

from subprocess import check_call


def notify (title, subtitle, message):
    cheek_call(['terminal-notifier','-title',title.encode("utf-8"),
                '-subtitle',subtitle.encode("utf-8"),
                '-message'.message.encode("utf-8")])

答案 1 :(得分:-1)

使用:'sys.getfilesystemencoding`来获取编码

用它对字符串进行编码,忽略或替换错误:

import sys

encoding = sys.getfilesystemencoding()
msg = new_scorer[0].text.replace(",", "")
print(msg.encode(encoding, errons="replace"))
相关问题