Question

Je suis en train d'écrire une application de débogage qui reçoit les données d'un processus basé sur C via UDP. L'une des chaînes qui m'a été envoyée contient un caractère & # 176; - Unicode U + 00B0 (ce qui a pour effet d'interrompre la fonction de recherche StackOverflow!). Lorsque mon application wxPython essaie d'ajouter cette chaîne à une zone de texte, un UnicodeDecodeError est créé.

Ma première tentative de résolution du problème a simplement attrapé cette erreur (car l'application envoie apparemment certains messages erronés. Le problème est que l'application utilise également le personnage pour signaler diverses températures autour de l'unité et Changer de source est hors de mon contrôle, alors comment puis-je détecter et décoder ces symboles en quelque chose que le wxTextCtrl peut afficher?

Était-ce utile?

La solution

pdc l'a bien compris, les opérations suivantes fonctionnent bien (mais échouent sans le décoder ):

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

Autres conseils

Je ne peux pas dire grand chose à propos de wxPython, mais je suppose qu'il essaie de convertir le texte en Unicode avant de l'afficher, si vous avez une chaîne comme '123 \ xB0' et essayez de le convertir en Unicode avec le codage par défaut (ASCII), puis il lancera UnicodeDecodeError . Vous pouvez probablement résoudre ce problème en remplaçant

s = message.get_string()

avec

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

(où j'assume une fonction get_string () qui obtient le message sous forme de chaîne). La différence est que, lors de la conversion en Unicode, vous devez spécifier le codage.

Les choses ont peut-être été différentes quand cela a été demandé, mais je pense à ceux qui trébuchent:

Le problème est que wxPython essaie de convertir le format TO unicode et qu'il manque d'informations sur le jeu de caractères pour essayer d'utiliser ASCII, qui n'est pas valide. Si vous savez que vos données sont au format utf-8, dites-le-nous et cela fonctionnera.

#!/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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top