سلسلة ترميزات في بايثون
سؤال
في بيثون, سلاسل قد يكون 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 - وليس مضمونا ل بطبيعة الحال، ولكن أحيانا التخمينات الصحيح ؛-). ولكن ذلك لن يساعد كثيرا مع سلاسل قصيرة جدا.