PEP 686 - Python 3.15 से UTF-8 मोड डिफ़ॉल्ट रूप से सेट
- UTF-8 व्यावहारिक रूप से मानक text encoding बनता जा रहा है
- Python source files की डिफ़ॉल्ट encoding UTF-8 है
- JSON, TOML, YAML UTF-8 का उपयोग करते हैं
- Visual Studio Code, Windows Notepad आदि अधिकांश text editors डिफ़ॉल्ट रूप से UTF-8 का उपयोग करते हैं
- अधिकांश websites और इंटरनेट पर मौजूद text data UTF-8 का उपयोग करते हैं
- Node.js, Go, Rust, Java जैसी कई अन्य लोकप्रिय programming languages भी डिफ़ॉल्ट रूप से UTF-8 का उपयोग करती हैं
- डिफ़ॉल्ट encoding को UTF-8 में बदलने से Python के लिए अन्य languages के साथ interoperable होना आसान हो जाता है
- Unix का उपयोग करने वाले कई Python developers यह भूल जाते हैं कि डिफ़ॉल्ट encoding platform के अनुसार अलग होती है
- UTF-8 में encoded text files (JSON, TOML, Markdown, Python source files आदि) पढ़ते समय वे
encoding="utf-8" निर्दिष्ट नहीं करते
- असंगत डिफ़ॉल्ट encodings के कारण कई bugs उत्पन्न होते हैं
PEP 686 में मुख्य बदलाव
- Python 3.15 से UTF-8 मोड डिफ़ॉल्ट रूप से सक्षम रहेगा
- उपयोगकर्ता अब भी
PYTHONUTF8=0 या -X utf8=0 सेट करके UTF-8 मोड को अक्षम कर सकते हैं
locale.getencoding() जोड़ा गया
- UTF-8 मोड की परवाह किए बिना locale encoding प्राप्त करने के लिए API
- यदि
warn_default_encoding विकल्प निर्दिष्ट है, तो locale.getpreferredencoding() भी open() की तरह EncodingWarning उत्पन्न करेगा (PEP 597 देखें)
encoding="locale" विकल्प में संशोधन
- यदि
encoding="locale" निर्दिष्ट है, तो TextIOWrapper को UTF-8 मोड में भी locale encoding का उपयोग करना चाहिए
Backward compatibility
- अधिकांश Unix systems UTF-8 locale का उपयोग करते हैं और Python locale के C या POSIX होने पर UTF-8 मोड सक्षम करता है, इसलिए यह बदलाव मुख्यतः Windows users को प्रभावित करेगा
- यदि Python program डिफ़ॉल्ट encoding पर निर्भर करता है, तो इस बदलाव से
UnicodeError, mojibake, या बिना चेतावनी के data corruption हो सकता है
- backward compatibility समस्याओं को हल करने के लिए दिशानिर्देश:
- UTF-8 मोड अक्षम करें
EncodingWarning (PEP 597) का उपयोग करके उन सभी स्थानों को खोजें जिन पर UTF-8 मोड का प्रभाव पड़ता है
- यदि
encoding विकल्प छोड़ा गया है, तो encoding="utf-8" या encoding="locale" उपयोग करने पर विचार करें
- यदि
locale.getpreferredencoding() उपयोग किया जा रहा है, तो "utf-8" या locale.getencoding() उपयोग करने पर विचार करें
- application को UTF-8 मोड में test करें
GN⁺ की राय
- यह PEP Python की डिफ़ॉल्ट encoding को UTF-8 में एकरूप बनाने का लक्ष्य रखता है ताकि अन्य languages और systems के साथ interoperability बढ़े। इससे Python को वैश्विक development environment में और अधिक सुचारु रूप से उपयोग करने में मदद मिलेगी
- हालांकि, यह बदलाव मौजूदा Python programs की backward compatibility को प्रभावित कर सकता है। खासकर Windows environment में चलने वाले programs के लिए सावधानी आवश्यक है
- developers को
EncodingWarning का उपयोग करके प्रभावित हिस्सों की पहचान करनी चाहिए और encoding विकल्प को स्पष्ट रूप से निर्दिष्ट करने जैसे तरीकों से निपटना चाहिए
- दीर्घकाल में इस बदलाव के Python ecosystem पर सकारात्मक प्रभाव पड़ने की उम्मीद है। हालांकि, अल्पकाल में कुछ projects में migration cost आ सकती है
- developers को Python 3.15 में upgrade की योजना बनाते समय इस बदलाव पर विचार करना चाहिए और आवश्यकता पड़ने पर backward compatibility के लिए उचित कदम उठाने चाहिए
1 टिप्पणियां
Hacker News राय
init.dscripts में समस्या हुई थी। root के रूप में चलने वाली Java execution scripts सामान्य user से अलग encoding इस्तेमाल करती थीं, जिससे समस्या हुईPython 2 charset से बंधा नहीं था, इसलिए वह हमेशा अच्छी तरह काम करता था, लेकिन Python 3 का सुधार सिर्फ सुधार से भी बढ़कर था
Python 3 script और Python 2 script में फर्क करने का तरीका:
"utf-8"string हो तो Python 3C.UTF-8locale में काम करे तो Python 3यह बदलाव स्वागतयोग्य है, और लगता है कि यह Python 3 को और "बेहतर" बनाएगा
मुझे लगा था कि यह Python 3 से ही default था
मुझे नहीं पता था कि Java UTF-16 से UTF-8 पर चला गया है
मुझे नहीं पता कि CPython की internal encoding UTF-8 है या नहीं
Python strings को index किया जा सकता है, लेकिन random access कम ही होता है, इसलिए ज़रूरत पड़ने पर lazy indexing करना बेहतर लग सकता है
अगर सिर्फ एक-एक कदम आगे-पीछे जाना हो, तो index की ज़रूरत नहीं होती
इसलिए लगता है कि internal रूप से UTF-8 representation संभव हो सकती है
यह
utf-8-sigक्यों नहीं है? BOM को optional रूप से handle करता है, इसलिए यह उपयोगी हैUTF-8 के संदर्भ में, Linux framebuffer में बहुत पहले से proper UTF-8 support होना चाहिए था
GNU Hurd के पास लगभग 2007 से UTF-8 support वाला एक बेहतर 'terminal console' था
अब 2024 में जाकर ऐसा बदलाव आ रहा है
अच्छा बदलाव है। अब बस JS को UTF-8 पर लाना बाकी है, लेकिन 1995 में लिखे गए code के साथ compatibility रखनी पड़ती है, इसलिए सुधार मुश्किल है