30 सेकंड में: मैंने i18n-स्थिति स्क्रिप्ट चलाया, स्क्रीन पर 4546 लिखा था, सभी
रूटमें। GitHub पर Linux CI हरा था। फिर मैंने दो बातें समझीं। Windows पथ का बैकस्लैश, स्क्रिप्ट स्लैश से नहीं तोड़ पाती। 'गुण' का Big5 कोड का दूसरा हिस्सा, वह खुद ASCII का\है। दोनों बातें अलग तरीकों से काम करती हैं, लेकिन अक्सर एक ही परम्परागत चीनी Windows मशीन पर साथ मिलकर उत्पन्न होती हैं।
मैं zh-TW वाले Windows 11 पर Taiwan.md की i18n-स्थिति स्क्रिप्ट बनाई रख रहा हूँ। उस रात मैंने i18n-status.py चलाया, जब तक टर्मिनल नंबरों को प्रिंट कर रहा था। कंसोल cp950 थी। आउटपुट में कोई रंगीन अक्षर नहीं था।
स्क्रीन 4546 पर रुक गई। सभी एक रूट नाम की श्रेणी में। Technology 0 था।
उसी हफ्ते GitHub पर, Linux पर CI हरा था।
स्क्रिप्ट का चर नाम zh_articles था, जो knowledge के अंदर अंग्रेजी, about और अंडरस्कोर डायरेक्टरी को छोड़कर स्कैन करता है, जापानी, कोरियाई, अरबी भाषा भी गिन ली जाती है। उस रात वह श्रेणी नाम तक नहीं तोड़ पा रहा था, 4000 से अधिक पथ एक ही सेल में डाल दिए गए। कोई अपवाद नहीं, कोई चेतावनी नहीं। सांख्यिकी पूरी साइट के टूटे हुए जैसा दिख रही थी, फ़ाइलें एक भी कम नहीं थीं।1
डिस्क पर पथ knowledge\Technology\कोई लेख.md है, फ़ोल्डर के बीच बैकस्लैश से अलग किए गए। स्क्रिप्ट split('/') का उपयोग करके श्रेणी नाम प्राप्त करती है। Linux पर यह काम करता है, क्योंकि पथ खुद ही स्लैश है। Windows पर यह बैकस्लैश नहीं तोड़ता, पूरा पथ वहीं वापस आ जाता है, लेख को डिफ़ॉल्ट रूट में डाल दिया जाता है।2
जब मैंने pathlib को डायरेक्टरी हैंडल करने दिया, तो Technology के अंदर 59 लेख थे, जो फ़ोल्डर के अंदर की चीज़ों के साथ मेल खाता है। बीच में सिर्फ एक धारणा: आपका मशीन किस प्रकार की रेखा का उपयोग करके फ़ोल्डर को अलग करता है।
एक ही पथ, दो तरीकों से काटना। split('/') स्लैश नहीं ढूंढ पाता, पूरा वहीं वापस आ जाता है; PureWindowsPath बैकस्लैश को पहचानता है, Technology वापस आता है। Taiwan.md योगदानकर्ता द्वारा निर्मित, CC BY-SA 4.0।
📝 संपादकी नोट: स्क्रिप्ट का वाक्य सही नहीं था, CI ने वाकई परीक्षण चलाया। टूटाव वहाँ है जहाँ 'लेखक वास्तव में बैठा है' और 'उपकरण कल्पना करता है कि वह कहाँ बैठा है' के बीच। यह खींचाव किसी भी प्रक्रिया की नहीं है, इसलिए कोई भी ज़िम्मेदार नहीं लेता।
'गुण' के अंदर वह स्लैश
पथ पहला स्तर है। दूसरा स्तर बहुत पुराना है, शब्दों के अंदर छिपा है।
Big5 1984 में तय हुआ, एक चीनी अक्षर दो बाइट। दूसरा बाइट अगर 0x40 से 0x7E के बीच है, तो ASCII के सामान्य उपयोग चिह्नों के साथ ओवरलैप हो जाता है: [, ], {, }, \, |। जब वह शिक्षक थे, तभी वह चायनीज़ टेक्नोलॉजी यूनिवर्सिटी के सूचना प्रबंधन विभाग के उपाध्यक्ष थे, जिन्होंने 2023 के अगस्त में सेवानिवृत्ति ले ली थी। उन्होंने अपनी शिक्षण पृष्ठ पर लिखा था: "चूँकि 40-7E सामान्य उपयोग चिह्नों का ASCII कोड रेंज है, इसलिए कभी-कभी इसे प्रोग्रामर्स के लिए परेशानी पैदा कर सकता है।"3
'गुण' का कोड A5 5C है। आखिरी वाला 0x5C, ASCII में बैकस्लैश \ है। एक बाइट-दर-बाइट स्कैन करने वाला प्रोग्राम, जो \ को एस्केप या विभाजक मान लेता है, 'गुण' के आधे हिस्से पर पहुँचता है, तो वह अपने आप को पथ मिल गया समझ जाता है। फ़ाइल नाम में 'गुण' है, पथ में 'गुण' है, दोनों यहीं गिर सकते हैं।
ताइवान और हांगकोंग के डेवलपर्स इसे 'हुँग हुँग' कहते हैं: 'हुँ' है B3 5C, 'गुण' है A5 5C, 'गिर' है BB 5C, तीन आम अक्षर एक साथ लिखकर एक नाम जैसा दिखता है।4 हुँग हुँग के अलावा, हुँग ने 'जो भी प्रोग्रामिंग गुंज' का भी उल्लेख किया, जिसका दूसरा कोड [, ], {, }, \ के साथ टकराता है, और स्कैनिंग उपकरण b5tm बनाया।3 एक बग को इंसान के नाम पर रखा जाता है, आम तौर पर इसलिए कि वह इतनी बार उत्पन्न होता है कि एक पीढ़ी को उसके बारे में बात करने का विकल्प रहता है।
2015 में, ब्लॉग 'डार्क थ्रेड' के लेखक ने Visual Studio 2015 में स्विच कर दिया। पुराना .cs अभी भी BIG5 में सहेजा गया है। जब कंपाइलर Roslyn की ओर बढ़ा, तो फ़ाइल में हुए हुँग हुँग कंपाइलेशन त्रुटि बन गए।
दो दिन बाद एक साथी ने उसे बताया, उन्होंने भी स्विच कर दिया था और वह भी बहुत देर तक फंसा था, अंत में वहीं वाले लेख की खोज करके वापस आ गए। एक उपयोगकर्ता के पास हजारों या लाखों फ़ाइलें थीं, एक स्विच करने पर अभी भी बची रह गईं, "अंत में VS2015 को Goodbye कहना पड़ा"। उसके बाद उसने UTF-8 में बदलने का एक छोटा सा उपकरण लिख दिया, क्योंकि मैन्युअली फाइलों को बचाना असंभव था।5
यह पहले वाले split('/') से एक ही बात नहीं है। एक आधुनिक उपकरण का धारणा यह मानता है कि पथ कैसे दिखेगा। एक 40 साल पुरानी चयन दोहरे बाइट के बाद, अक्षर के शरीर के अंदर चिह्न बस गए। तकनीक अलग है, बिल्कुल एक ही cp950 मशीन पर एक साथ आता है। इनपुट की ओर से अक्षर कैसे भेजा जाता है, देखें पूर्व एशियाई पाठ्यपुस्तक लिपि। यहाँ बात यह है कि अक्षर पहले से डिस्क पर है, फिर उपकरण श्रृंखला उसे पहचानती है या नहीं।
डिफ़ॉल्ट मान इस मशीन के लिए शाखा नहीं खोलता
Git डिफ़ॉल्ट रूप से core.quotePath खोलता है। बाइट 0x80 से अधिक वाले फ़ाइल नाम, git status उन्हें \344\270\255 जैसे अंकीय में प्रदर्शित करता है। चीनी फ़ाइल नाम अभी भी वहाँ हैं, आपको बस अपने रिपॉजिटरी के बारे में बात करते समय समझ नहीं आता।6 यह UTF-8 के ऊँचे बिट को एस्केप करता है। Big5 का 0x5C एक अलग मुद्दा है। दोनों बैकस्लैश जैसा दिखते हैं, कारण अलग है।
एक ही फ़ाइल, डिफ़ॉल्ट मान के तहत एक \345\212\237 की धड़कन। यहाँ बैकस्लैश Git द्वारा जोड़ा गया एस्केप है, 'गुण' अक्षर के उस 0x5C से संबंधित नहीं है। Taiwan.md योगदानकर्ता द्वारा निर्मित, CC BY-SA 4.0।
Python 3 पर Windows पर अगर open() में encoding='utf-8' नहीं लिखा गया, तो वह सिस्टम भाषा का अनुसरण कर सकता है। एक ही UTF-8 फ़ाइल, Linux पढ़ सकता है, यह मशीन cp950 का उपयोग करके डिकोड करती है, चिह्न या बाइ-ज़ी पूरी तरह से खराब हो जाते हैं।7 मैंने खुद एक बार भुगतान किया: PowerShell 5.1 के Get-Content | Set-Content का उपयोग करके UTF-8 फ़ाइल को संशोधित करने पर, लंबे अवधि रेखा diff पर ?? में बदल गई। वह भी एक डिफ़ॉल्ट कर, दूसरा विषय नहीं है।
जब स्थिति संदेश में इमोजी शामिल होते हैं, तो यह cp950 कंसोल सीधे टूट जाती है। चिह्नों के अंदर उन चिह्नों की कमी है, Python उन्हें प्रिंट नहीं कर पाता, अपवाद सबसे ऊपर तक पहुँच जाता है। Linux CI इस बात को महसूस नहीं कर सकता, क्योंकि वह इस मशीन पर नहीं चल रहा है।
Git, Python, CI उदाहरण पथों में $HOME/project/src, zh-TW के Windows के लिए अलग शाखा नहीं खोलता।
हुँग 2015 में iThome के साक्षात्कार में, सरकारी फ़ाइल को किस प्रकार से खोलना चाहिए और कितना समय तक जीवित रहना चाहिए, पूछा। उसके अनुसार: अगर सरकार केवल Microsoft के उत्पादों का उपयोग करके फ़ाइल डेटा खोलती है, तो उसका मतलब है कि वह Microsoft के जीवन को चीन गणराज्य से अधिक मानती है।8 उस वाक्य का संदर्भ फ़ाइल स्वरूप और संग्रहालयी आयु है। डेटा किस डिफ़ॉल्ट उपकरण पर निर्भर करता है, समय के साथ वह गुण को पढ़ने वाला कौन है। ओपन-सोर्स सहयोग कुछ एक मशीन के डिफ़ॉल्ट वातावरण से जुड़ा है। नागरिक तकनीक और सरकारी फ़ाइल स्वरूप के बीच का संघर्ष, देखें ओपन-सोर्स समुदाय और g0v। ताइवान के डेवलपर्स ने इस अंतर की संस्कृति को दीर्घकाल तक अपनाया है, देखें ताइवान का ओपन-सोर्स आत्मा।
पथ विभाजक, टर्मिनल एन्कोडिंग, CI उदाहरणों में $HOME, इस मशीन के लिए अलग शाखा नहीं खोलता। 4546 पथ गलत श्रेणी में डाले गए दिन, कोई भी पंक्ति प्रोग्राम त्रुटि नहीं देखी। सांख्यिकी सामान्य लग रही थी, जब तक आप इस मशीन के सामने न बैठे।
आगे के पढ़ने के लिए
- ताइवान का ओपन-सोर्स आत्मा: ताइवान के डेवलपर्स के ओपन-सोर्स में भाग लेने की संस्कृति और संदर्भ।
- पूर्व एशियाई पाठ्यपुस्तक लिपि: अक्षर कैसे टाइप किए जाते हैं, कोड टेबल से लेकर कीबोर्ड तक।
- ओपन-सोर्स समुदाय और g0v: खुले डेटा और सरकारी स्वरूप के बीच सहयोग।
छवि स्रोत
- 'गुण' का Big5 कोड और बैकस्लैश (hero): Taiwan.md योगदानकर्ता द्वारा निर्मित चित्रण, CC BY-SA 4.0,
public/article-images/technology/big5-gong-5c-backslash.webpमें संग्रहीत। नीचे वाली पंक्ति Python 3 का वास्तविक निष्पादन'हुँग हुँग'.encode('big5')का आउटपुट है, कोड बिंदु विकीपीडिया के बड़े पाँच कोड एंट्री के साथ मेल खाता है।4 - split('/') और PureWindowsPath: Taiwan.md योगदानकर्ता द्वारा निर्मित, CC BY-SA 4.0,
public/article-images/technology/windows-path-split-vs-pathlib.svgमें संग्रहीत। सामग्री Python 3 के वास्तविक निष्पादन परिणाम है;PureWindowsPathकिसी भी ऑपरेटिंग सिस्टम पर Windows नियमों के अनुसार पथ काटता है, इसलिए Windows मशीन की आवश्यकता नहीं है। - Git core.quotePath का अंकीय आउटपुट: Taiwan.md योगदानकर्ता द्वारा निर्मित, CC BY-SA 4.0,
public/article-images/technology/git-quotepath-octal-cjk.svgमें संग्रहीत। सामग्री एक अस्थायी रिपॉजिटरी में इस लेख के फ़ाइल नाम को जोड़कर,git status --shortका वास्तविक आउटपुट है; यह व्यवहार ऑपरेटिंग सिस्टम से संबंधित नहीं है।
संदर्भ
- taiwan-md PR #1260 — 2026-07-26 में मर्ज किया गया। Windows पर श्रेणियाँ केवल root: 4546, ठीक हुआ Technology zh: 59। जिस चीज़ को cp955 कंसोल को टूटाती है, उसे इमोजी को भी हटा दिया गया।↩
- Microsoft Learn: Windows सिस्टम पर फ़ाइल पथ स्वरूप — .NET दस्तावेज़ ऐतिहासिक DOS पथ को डायरेक्टरी विभाजक के रूप में बैकस्लैश का उपयोग करता है, स्लैश को बैकस्लैश में बदल देता है।↩
- हुँग चायनीज़ टेक्नोलॉजी यूनिवर्सिटी: प्रोग्रामिंग के दौरान संभावित big-5 समस्याएँ — शिक्षण पृष्ठ दूसरे कोड ASCII जोखिम क्षेत्र में पड़ने वाले आम अक्षरों की सूची देता है (जो भी प्रोग्रामिंग गुंज), और स्कैनिंग उपकरण b5tm का परिचय देता है। पृष्ठ के नीचे कर्मशीर्ष नहीं लिखा गया। 2015 में iThome ने उपाध्यक्ष कहा। वह व्यक्ति ने 1997 से 2023 तक चायनीज़ टेक्नोलॉजी यूनिवर्सिटी में कार्य करते हुएए, 2023 के अगस्त में सेवानिवृत्ति ले ली।↩2
- विकीपीडिया: बड़ा पाँच कोड — 'गुण' 0xA55C, 'हुँ' 0xB35C, 'गिर' 0xBB5C के साथ उल्लेख करता है, और यह समस्या को 'हुँग हुँग' कहकर पुकारा गया है।↩2
- डार्क थ्रेड: छिपा शील्ड मशीन - Visual Studio 2015 BIG5 संगतता समस्या का समाधान — 2015 में Visual Studio 2015 में BIG5 स्रोत कोड कंपाइल करते समय हुए हुँग हुँग कंपाइलेशन त्रुटि का दस्तावेज़। लेख में "अंत में VS2015 को Goodbye कहना पड़ा" शब्द हैं।↩
- git-config: core.quotePath — आधिकारिक दस्तावेज़ ऐसा कहता है कि डिफ़ॉल्ट रूप से 0x80 से अधिक बाइट वाले पथ को अंकीय एस्केप अनुक्रम में प्रदर्शित करता है।↩
- Python 3: open() — फ़ंक्शन दस्तावेज़ ऐसा कहता है कि encoding निर्दिष्ट न किए जाने पर, सिस्टम भाषा को डिफ़ॉल्ट एन्कोडिंग के रूप में अपनाया जा सकता है।↩
- iThome: हुँग चायनीज़ टेक्नोलॉजी यूनिवर्सिटी का साक्षात्कार — 2015 का साक्षात्कार, लेख में चायनीज़ टेक्नोलॉजी यूनिवर्सिटी के सूचना प्रबंधन विभाग के उपाध्यक्ष कहा गया है। मूल पृष्ठ अक्सर 403 देता है, Microsoft के जीवन के बारे में वाक्य केवल खोज परिणामों में दिखाए गए रिपोर्टों के अनुसार, उन्हें शब्द-दर-शब्द उद्धृत नहीं माना गया।↩