فك شفرة مزدوجة المشفرة UTF8 في بيثون
سؤال
لدي مشكلة مع السلاسل التي أحصل عليها من أحد عملائي عبر XMLRPC. يرسل لي سلاسل UTF8 التي يتم ترميزها مرتين :( لذلك عندما أحصل عليها في بيثون لدي كائن يونيكود الذي يجب فك إزعاجه مرة أخرى، ولكن من الواضح أن بيثون لا يسمح بذلك. لقد لاحظت موكلي ولكني أحتاج للقيام بدوارة سريعة الآن قبل إصلاحه.
سلسلة RAW من تفريغ TCP:
<string>Rafa\xc3\x85\xc2\x82</string>
يتم تحويل هذا إلى:
u'Rafa\xc5\x82'
أفضل ما نحصل عليه هو:
eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8")
هذا يؤدي إلى السلسلة الصحيحة التي هي:
u'Rafa\u0142'
ومع ذلك، فإن هذا يعمل قبيح مثل الجحيم ولا يمكن استخدامه في رمز الإنتاج. إذا كان أي شخص يعرف كيفية إصلاح هذه المشكلة بطريقة أكثر ملاءمة، يرجى الكتابة. شكرا كريس
المحلول
>>> S = U'rafa XC5 X82 '>>> S.Encode (' raw_unicode_escape '). فك تشفير (' UTF-8 ') U'rafa U0142' >>>
نصائح أخرى
yow، كان ذلك متعة!
>>> original = "Rafa\xc3\x85\xc2\x82"
>>> first_decode = original.decode('utf-8')
>>> as_chars = ''.join([chr(ord(x)) for x in first_decode])
>>> result = as_chars.decode('utf-8')
>>> result
u'Rafa\u0142'
لذلك يمكنك فك التشفير الأول، والحصول على سلسلة Unicode حيث تكون كل حرف في الواقع قيمة بايت UTF-8. تذهب عبر القيمة العصرية لكل من تلك الأحرف للعودة إلى سلسلة UTF-8 أصيلة، والتي فكزها بشكل طبيعي.
>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>
Latin1 هو مجرد اختصار لطريقة Nuts'n'n'bolts لريشي.
من الغريب جدا أن تحت الموصوف بجدية raw_unicode_escape
برنامج الترميز يعطي نفس النتيجة latin1
في هذه الحالة. هل لديهم دائما نفس النتيجة؟ إذا كان الأمر كذلك، لماذا لديك مثل هذا الترميز؟ إذا لم يكن الأمر كذلك، فمن الأفضل أن تعرف بالتأكيد كيف فعل عميل OP بالتحول من 'Rafa\xc5\x82'
ل u'Rafa\xc5\x82'
ثم إلى عكس هذه العملية بالضبط - وإلا فقد قد نأتي إلعب إذا تم إصلاح خصومات البيانات المختلفة قبل الترميز المزدوج.