سؤال

هذا في بيثون 2.4.هذا هو وضعي.أقوم بسحب سلسلة من قاعدة بيانات، وهي تحتوي على حرف "o" (\xf6).في هذه المرحلة، إذا قمت بتشغيل النوع (القيمة) فإنه يُرجع str.ثم حاولت بعد ذلك تشغيل .decode('utf-8')، وظهر لي خطأ (يتعذر على برنامج الترميز 'utf8' فك تشفير البايتات في الموضع 1-4).

حقًا هدفي هنا هو فقط جعل النوع (القيمة) يُرجع Unicode بنجاح.لقد وجدت سؤال سابقالتي تحتوي على بعض المعلومات المفيدة، ولكن يبدو أن المثال من الإجابة المختارة لا يناسبني.هل هناك شيء أفعله خطأ هنا؟

إليك بعض التعليمات البرمجية لإعادة إنتاجها:

Name = 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %s - %s\n' %(Name, type(Name)))

لم أتمكن أبدًا من الوصول إلى بيان الكتابة، لأنه فشل في البيان الأول.

شكرا لك على مساعدتك.

يحرر:

لقد تحققت من أن مجموعة أحرف قاعدة البيانات هي utf8.لذلك في الكود الخاص بي لإعادة الإنتاج قمت بتغيير '\xf6' إلى '\xc3\xb6'، ولا يزال الفشل يحدث.هل هناك فرق بين "utf-8" و"utf8"؟

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

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

المحلول

لذا، في الكود الخاص بي لإعادة الإنتاج قمت بتغيير '\xf6' إلى '\xc3\xb6'، ولا يزال الفشل يحدث

ليس في السطر الأول لا:

>>> 'w\xc3\xb6rner'.decode('utf-8')
u'w\xf6rner'

على الرغم من ذلك، سيظهر خطأ في السطر الثاني:

>>> file.write('Name: %s - %s\n' %(Name, type(Name)))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)

وهو ما تتوقعه تمامًا، وهو محاولة كتابة أحرف غير ASCII Unicode إلى دفق بايت.إذا استخدمت اقتراح Jiri الخاص بدفق مغلف ببرامج الترميز، فيمكنك كتابة Unicode مباشرة، وإلا فسيتعين عليك إعادة ترميز سلسلة Unicode إلى بايت يدويًا.

من الأفضل، لأغراض التسجيل، أن تقوم ببساطة بإخراج الدالة repr() للمتغير.إذن لا داعي للقلق بشأن وجود أحرف Unicode هناك، أو الأسطر الجديدة أو الأحرف الأخرى غير المرغوب فيها:

name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r\n' % name)

Name: u'w\xf6rner'

نصائح أخرى

السلسلة الخاصة بك ليس بتشفير UTF8.إذا كنت تريد "فك تشفير" السلسلة إلى Unicode، فيجب أن تكون السلسلة الخاصة بك بالتشفير الذي حددته بواسطة المعلمة.لقد جربت هذا ويعمل بشكل مثالي:

print 'w\xf6rner'.decode('cp1250')

يحرر

لكتابة سلاسل Unicode إلى الملف، يمكنك استخدام وحدة برامج الترميز:

import codecs
f = codecs.open("yourfile.txt", "w", "utf8")
f.write( ... )

من السهل تحديد تشفير الإدخال/الإخراج واستخدام سلسلة "unicode" في جميع أنحاء التعليمات البرمجية الخاصة بك دون إزعاج الترميزات المختلفة.

من الواضح أنه ترميز 1 بايت.'ö' في UTF-8 هو '\xc3\xb6'.

قد يكون الترميز:

  • ايزو-8859-1
  • ايزو-8859-2
  • ايزو-8859-13
  • ايزو-8859-15
  • فوز 1250
  • فوز 1252

تحتاج إلى استخدام "ISO-8859-1":

Name = 'w\xf6rner'.decode('iso-8859-1')
file.write('Name: %s - %s\n' %(Name, type(Name)))

يستخدم utf-8 2 بايت للهروب من أي شيء خارج ascii، ولكنه هنا بايت واحد فقط، لذا من المحتمل أن يكون iso-8859-1 صحيحًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top