Как безопасно декодировать символ градусов в приложении wxPython?

StackOverflow https://stackoverflow.com/questions/262249

Вопрос

У меня есть отладочное приложение, которое я пишу, которое получает данные от процесса на основе C через UDP. В одной из присланных мне строк содержится символ & # 176; - Unicode U + 00B0 (что случайно нарушает функцию поиска StackOverflow!). Когда мое приложение wxPython пытается добавить эту строку в текстовое поле, я получаю UnicodeDecodeError .

Моя первая попытка исправить проблему просто обнаружила эту ошибку (потому что приложение, по-видимому, отправляет некоторые плохие сообщения. Проблема в том, что приложение также использует символ для сообщения о различных температурах вокруг устройства и это то, что нам действительно нужно регистрировать. Изменение исходного приложения не зависит от меня, так как я могу обнаружить и декодировать эти символы в то, что может отображать wxTextCtrl ?

Это было полезно?

Решение

pdc понял все правильно, следующее работает нормально (но без 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()

Другие советы

Я не могу сказать mych о самом wxPython, но я предполагаю, что он пытается преобразовать текст в Unicode перед его отображением, если у вас есть строка типа '123 \ xB0' и попытайтесь преобразовать его в Unicode с кодировкой по умолчанию (ASCII), тогда он выдаст UnicodeDecodeError . Вы можете исправить это, заменив

s = message.get_string()

с

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

(где я предполагаю функцию get_string () , которая получает сообщение в виде строки). Разница здесь в том, что, вручную преобразовав Unicode, вы можете указать кодировку.

Когда это спросили, все могло быть иначе, но я думаю о тех, кто сталкивается с этим:

Проблема в том, что wxPython пытается преобразовать в юникод TO, и при отсутствии информации о кодировке он пытается использовать ASCII, что недопустимо. Если вы знаете, что у вас есть данные utf-8, сообщите об этом, и это сработает.

#!/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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top