Como faço para decodificar de forma segura um símbolo graus em um aplicativo wxPython?
Pergunta
Eu tenho um aplicativo de depuração Eu tenho escrito, que recebe dados de um processo baseado em C via UDP. Uma das cordas enviadas para mim contém um caractere °
- Unicode U + 00B0 (que, aliás breaks a função de pesquisa StackOverflow!). Quando minhas tentativas de aplicação wxPython para anexar essa string para uma caixa de texto eu recebo um UnicodeDecodeError
.
A minha primeira tentativa para corrigir o problema simplesmente pegou esse erro (porque o aplicativo aparentemente não enviar alguns mensagens ruins. O problema é que o aplicativo também usa o personagem para relatar várias temperaturas em torno da unidade e isso é algo que realmente precisa fazer login. Alterar o aplicativo fonte está fora do meu controle, assim como eu pode detectar e decodificar os símbolos em algo que o wxTextCtrl
pode exibir?
Solução
pdc que tenham acertado, o seguinte fina funciona (mas não sem a 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()
Outras dicas
Eu não posso dizer mych sobre si wxPython, mas eu estou supondo que ele está tentando converter o texto para Unicode antes de exibi-lo, se você tem uma string como '123\xB0'
e tentar convertê-lo para Unicode com teh codificação padrão ( ASCII), então ele vai jogar UnicodeDecodeError
. Provavelmente, você pode corrigir isso, substituindo
s = message.get_string()
com
s = message.get_string().decode('ISO8859-1')
(onde eu estou assumindo uma get_string()
função que recebe a mensagem como uma string). A diferença aqui é que por Handong a conversão para Unicode se você começa a especificar a codificação.
As coisas podem ter de volta foi diferente quando este foi questionado, mas meus pensamentos para qualquer um que tropeça sobre isso:
A questão é wxPython está tentando converter para Unicode, e tem informação sobre o charset ele tenta usar ASCII, que é inválido. Se você sabe que seus dados é utf-8, diga-lo e ele vai apenas trabalho.
#!/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()