Как безопасно декодировать символ градусов в приложении wxPython? - PullRequest
0 голосов
/ 04 ноября 2008

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

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

Ответы [ 3 ]

2 голосов
/ 04 ноября 2008

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()
1 голос
/ 04 ноября 2008

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

s = message.get_string()

с

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

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

0 голосов
/ 21 ноября 2012

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

Проблема в том, что 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()
...