如何在wxPython应用中安全解码度数符号?
我正在写一个调试应用程序,它通过UDP从一个基于C的进程接收数据。其中有一个字符串包含一个°
字符,也就是Unicode U+00B0(顺便说一下,这个字符还会导致StackOverflow的搜索功能出问题!)。当我的wxPython应用程序试图把这个字符串添加到文本框时,就出现了UnicodeDecodeError
的错误。
我第一次尝试解决这个问题时,只是简单地捕获了这个错误(因为这个应用程序显然会发送一些错误的信息)。问题是,这个应用程序还用这个字符来报告设备周围的各种温度,而这些信息我们是非常需要记录的。由于我无法控制源应用程序的修改,那我该如何检测并解码这些符号,让wxTextCtrl
能够显示呢?
3 个回答
0
事情在当时可能有所不同,但我想对任何看到这个的人说几句:
问题在于wxPython正在尝试转换成unicode格式,但因为缺少字符集信息,它就试图使用ASCII,这样是不对的。如果你知道你的数据是utf-8格式,就告诉它,这样就能正常工作了。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wx
app = wx.PySimpleApp()
app.TopWindow = wx.Frame(None)
field = wx.TextCtrl(app.TopWindow)
string_data = '°'
print type(string_data)
# this would error, as it tries to convert to unicode from ascii
# field.Value += string_data
unicode_data = unicode(string_data, 'utf-8')
print type(unicode_data)
field.Value += unicode_data
app.TopWindow.Show()
app.MainLoop()
1
我对wxPython本身了解不多,但我猜它在显示文本之前会尝试把文本转换成Unicode格式。如果你有一个像 '123\xB0'
这样的字符串,然后用默认的编码(ASCII)去转换它,就会出现 UnicodeDecodeError
的错误。你可以通过把
s = message.get_string()
替换成
s = message.get_string().decode('ISO8859-1')
来解决这个问题(这里我假设有一个函数 get_string()
用来获取消息字符串)。这样做的不同之处在于,你自己来处理转换成Unicode的过程,这样就可以指定编码方式。
2
pdc说得对,下面的代码运行得很好(但如果没有decode
就会出问题):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import wx
app = wx.PySimpleApp()
app.TopWindow = wx.Frame(None)
field = wx.TextCtrl(app.TopWindow)
field.Value += '°'.decode('ISO8859-1')
app.TopWindow.Show()
app.MainLoop()