Как безопасно декодировать символ градусов в приложении wxPython?
Вопрос
У меня есть отладочное приложение, которое я пишу, которое получает данные от процесса на основе 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()