سؤال

في بيثون, سلاسل قد يكون unicode ( سواء utf-16 و utf-8 ) و بايت واحد مع مختلف ترميزات ( cp1251, cp1252 الخ ).هل من الممكن أن تحقق ما ترميز السلسلة ؟ على سبيل المثال ،

time.strftime( "%b" )

سيعود سلسلة مع النص اسم الشهر.تحت ماك عاد السلسلة سوف يكون utf-16, تحت ويندوز مع اللغة الإنجليزية المحلية سيكون بايت واحد مع الترميز ascii و تحت ويندوز مع غير الإنجليزية لغة سيكون المشفرة عبر لغة هو الشفرة ، على سبيل المثال cp1251.كيف يمكنني التعامل مع مثل هذه السلاسل ؟

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

المحلول

وسلاسل لا تخزن أية معلومات الترميز، لديك فقط لتحديد واحد عند تحويل إلى / من Unicode أو الطباعة إلى جهاز إخراج:

import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)

وUTF-8 هو <م> لا يونيكود، انها ترميز يونيكود في سلاسل بايت واحد.

وأفضل الممارسات في العمل مع يونيكود في كل مكان على الجانب الثعبان، تخزين سلاسل الخاص بك مع ترميز يونيكود عكسها مثل UTF-8، وتحويله إلى لغات نزوة فقط لإخراج المستخدم.

نصائح أخرى

ترميز محارف الكشف معقدة جدا.

ومع ذلك ، ما هو الغرض الحقيقي من أجل هذا ؟ إذا كنت ترغب فقط في القيمة في يونيكود ، ببساطة كتابة

unicode(time.strftime("%b"))

وينبغي أن تعمل جميع الحالات التي قمت المذكورة أعلاه:

  • نظام التشغيل mac os:يونيكود(unicode) -> unicode
  • فوز/eng:unicode(ascii) -> unicode
  • فوز/noneng:unicode(some_cp) -> سيتم تحويلها المحلية cp -> unicode

إذا كان لديك سلسلة طويلة إلى حد معقول في ترميز غير معروف، يمكنك محاولة لتخمين الترميز، على سبيل المثال مع الكاشف العالمي ترميز في https://github.com/dcramer/chardet - وليس مضمونا ل بطبيعة الحال، ولكن أحيانا التخمينات الصحيح ؛-). ولكن ذلك لن يساعد كثيرا مع سلاسل قصيرة جدا.

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