Pregunta

Tengo una aplicación de depuración que he estado escribiendo que recibe datos de un proceso basado en C a través de UDP. Una de las cadenas que me enviaron contiene un carácter ° : Unicode U + 00B0 (que incidentalmente rompe la función de búsqueda StackOverflow!). Cuando mi aplicación wxPython intenta agregar esa cadena a un cuadro de texto, obtengo un UnicodeDecodeError .

Mi primer intento de solucionar el problema simplemente captó ese error (porque la aplicación aparentemente envía algunos mensajes incorrectos. El problema es que la aplicación también usa el carácter para informar varias temperaturas alrededor de la unidad y eso es algo que realmente necesitamos registrar. Cambiar la aplicación de origen está fuera de mi control, entonces, ¿cómo puedo detectar y decodificar esos símbolos en algo que wxTextCtrl pueda mostrar?

¿Fue útil?

Solución

pdc lo hizo bien, lo siguiente funciona bien (pero falla sin la decodificación ):

#!/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()

Otros consejos

No puedo decir mych sobre wxPython, pero supongo que está intentando convertir el texto a Unicode antes de mostrarlo, si tiene una cadena como '123 \ xB0' y intente convertirlo a Unicode con la codificación predeterminada (ASCII) y luego arrojará UnicodeDecodeError . Probablemente pueda solucionar esto reemplazando

s = message.get_string()

con

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

(donde estoy asumiendo una función get_string () que obtiene el mensaje como una cadena). La diferencia aquí es que a mano la conversión a Unicode usted mismo puede especificar la codificación.

Las cosas pueden haber sido diferentes cuando se le preguntó esto, pero mis pensamientos para cualquiera que tropiece con esto:

El problema es que wxPython está intentando convertir TO unicode y, al carecer de información de conjunto de caracteres, intenta usar ASCII, que no es válido. Si sabe que sus datos son utf-8, dígalo y funcionará.

#!/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()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top