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?

Foi útil?

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top