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

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

有帮助吗?

解决方案

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()

其他提示

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

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

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

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

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

问题是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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top