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?

È stato utile?

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()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top