كيف يمكنني بأمان فك شفرة درجة رمز في التطبيق كسبيثون؟
سؤال
ولدي التطبيق التصحيح لقد تم كتابة التي تتلقى البيانات من العملية المستندة 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()