كيف يمكنني بأمان فك شفرة درجة رمز في التطبيق كسبيثون؟

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

سؤال

ولدي التطبيق التصحيح لقد تم كتابة التي تتلقى البيانات من العملية المستندة C عبر UDP. واحدة من سلاسل أرسلت لي يحتوي على حرف ° - يونيكود U + 00B0 (والذي بالمناسبة فواصل وظيفة البحث ستاكوفيرفلوو!). عندما يحاول تطبيق كسبيثون بلدي لإلحاق هذه السلسلة إلى مربع نص أحصل على UnicodeDecodeError.

وأول محاولة لإصلاح المشكلة اشتعلت ببساطة أن خطأ (لأن التطبيق على ما يبدو لم يرسل <م> بعض رسائل سيئة، ولكن المشكلة هي أن التطبيق يستخدم أيضا الطابع الإبلاغ عن درجات حرارة مختلفة حول وحدة و هذا شيء نحن حقا في حاجة إلى تسجيل. تغيير التطبيق مصدر خارج عن إرادتي، فكيف يمكنني الكشف عن وفك تلك الرموز إلى شيء wxTextCtrl يمكن عرض؟

هل كانت مفيدة؟

المحلول

والحزب الديمقراطي المسيحي حصل ذلك الحق، ما يلي يعمل بشكل جيد (ولكن فشل دون 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 حول كسبيثون نفسها، ولكن أنا على التخمين بأنها تسعى لتحويل النص إلى Unicode قبل عرضه، إذا كان لديك سلسلة مثل '123\xB0' ومحاولة تحويلها إلى Unicode مع تيه الترميز الافتراضي ( ASCII) بعد ذلك سوف رمي UnicodeDecodeError. ربما يمكنك حل هذه عن طريق استبدال

s = message.get_string()

مع

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

و(أين أنا على افتراض get_string() وظيفة الذي يحصل على رسالة كسلسلة). الفرق هنا هو أن من هان دونغ تحويل إلى Unicode نفسك تحصل لتحديد الترميز.

قد يكون

والأمور إلى الوراء مختلفة عندما سئل هذا، ولكن أفكاري لمن يتعثر على هذا:

ووكسبيثون وتحاول قضية تحويل إلى Unicode، وتفتقر إلى معلومات محارف يحاول استخدام 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