2008-11-04 1 views
0

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

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

ответ

2

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() 
+0

На всякий случай это приложение для Windows, лучше использовать кодировку «cp1252». Неважно, если вы получаете только знаки степени (это одинаково для обоих). – tzot 2008-11-04 20:39:56

1

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

s = message.get_string() 

с

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

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

0

Вещи могут быть разные назад, когда это было предложено, но мои мысли для тех, кто натыкается на это:

Проблема заключается в том, что wxPython пытается преобразовать в Юникод и не имеет информации о кодировке, которую он пытается использовать 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() 
Смежные вопросы