如何在wxPython应用中安全解码度数符号?

0 投票
3 回答
1820 浏览
提问于 2025-04-11 09:34

我正在写一个调试应用程序,它通过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()

撰写回答