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

时间:2008-11-04 16:07:02

标签: python unicode wxpython decode textctrl

我有一个我一直在编写的调试应用程序,它通过UDP从基于C的进程接收数据。发送给我的其中一个字符串包含一个°字符 - Unicode U+00B0(偶然会破坏StackOverflow搜索功能!)。当我的wxPython应用程序尝试将该字符串附加到文本框时,我得到UnicodeDecodeError

我第一次尝试修复此问题只是抓住了这个错误(因为该应用显然确实发送了一些错误消息。问题是应用程序还使用该字符报告设备周围的各种温度和这是我们真正需要记录的东西。更改源应用程序是我无法控制的,那么如何检测并解码这些符号到wxTextCtrl可以显示的内容?

3 个答案:

答案 0 :(得分: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()

答案 1 :(得分:1)

我不能说myx关于wxPython本身,但我猜它是在尝试将文本转换为Unicode之前显示它,如果你有一个像'123\xB0'这样的字符串并尝试将其转换为Unicode默认编码(ASCII)然后它会抛出UnicodeDecodeError。你可以通过替换

来解决这个问题
s = message.get_string()

s = message.get_string().decode('ISO8859-1')

(我假设一个函数get_string()将消息作为字符串获取)。这里的区别在于,通过手动转换为Unicode,您可以指定编码。

答案 2 :(得分:0)

当问到这个问题时,情况可能会有所不同,但我对任何偶然发现这一点的人的想法是:

问题是wxPython正在尝试转换为unicode,并且缺少charset信息,它尝试使用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()