Come posso decodificare in modo sicuro un simbolo di gradi in un'app wxPython?
Domanda
Ho un'app di debug che sto scrivendo che riceve dati da un processo basato su C tramite UDP. Una delle stringhe che mi è stata inviata contiene un carattere & # 176;
- Unicode U + 00B0 (che interrompe accidentalmente la funzione di ricerca StackOverflow!). Quando la mia applicazione wxPython tenta di aggiungere quella stringa a una casella di testo, ottengo un UnicodeDecodeError
.
Il mio primo tentativo di risolvere il problema ha semplicemente rilevato quell'errore (perché l'app invia apparentemente alcuni messaggi errati. Il problema è che l'app utilizza anche il personaggio per segnalare varie temperature intorno all'unità e è qualcosa che dobbiamo davvero registrare. Cambiare l'app di origine è fuori dal mio controllo, quindi come posso rilevare e decodificare quei simboli in qualcosa che wxTextCtrl
può visualizzare?
Soluzione
pdc ha capito bene, il seguente funziona benissimo (ma fallisce senza il decodifica
):
#!/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()
Altri suggerimenti
Non posso dire mych su wxPython stesso, ma suppongo che stia cercando di convertire il testo in Unicode prima di visualizzarlo, se hai una stringa come '123 \ xB0'
e prova a convertirlo in Unicode con la codifica predefinita (ASCII), quindi genererà UnicodeDecodeError
. Probabilmente puoi risolvere questo problema sostituendo
s = message.get_string()
con
s = message.get_string().decode('ISO8859-1')
(dove sto assumendo una funzione get_string ()
che ottiene il messaggio come una stringa). La differenza qui è che manualmente la conversione in Unicode puoi specificare la codifica.
Le cose potrebbero essere state diverse quando è stato chiesto, ma i miei pensieri per chiunque si imbatte in questo:
Il problema è che wxPython sta provando a convertire in Unicode e, in mancanza di informazioni sui set di caratteri, tenta di utilizzare ASCII, che non è valido. Se sai che i tuoi dati sono utf-8, informalo e funzionerà.
#!/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()