चीनी \u4e2d\u6587 में क्यों बदल जाता है
मुख्य बात: \u4e2d\u6587 escape वैध Unicode है, एन्कोडिंग विफलता नहीं। असली mojibake अलग दिखता है, और दोनों में अंतर करने से तय होता है कि वास्तव में क्या ठीक करना है।

मुख्य बात: \uXXXX आउटपुट को वैध escaping मानें, पुष्टि करें कि यह JSON.parse से round-trip होता है, और जब पठनीय चीनी चाहिए तो ensure_ascii=False जैसी शुद्ध-ASCII सीरियलाइज़ेशन बंद करें; escaping केवल उन ट्रांसपोर्ट के लिए रखें जो गैर-ASCII नहीं ले जा सकते।
क्योंकि इसे escape किया गया, खराब नहीं किया गया।
JSON.parse('"\\u4e2d\\u6587"') // "中文"
\u4e2d 中 है और \u6587 文। ये वैध escape अनुक्रम हैं; कोई भी पार्सर इन्हें बहाल करता है। कुछ टूटा नहीं है — यह केवल लॉग, diffs और packet captures में अपठनीय है।
escaping कौन करता है
| टूल | डिफ़ॉल्ट | टॉगल |
|---|---|---|
Python json.dumps |
escape करता है (ensure_ascii=True) |
ensure_ascii=False |
JavaScript JSON.stringify |
escaping नहीं | — |
| Java Jackson | escaping नहीं | वैकल्पिक |
PHP json_encode |
5.4 से escaping नहीं | — |
Go encoding/json |
escaping नहीं | — |
Python सबसे आम स्रोत है। डिफ़ॉल्ट का अपना कारण है: शुद्ध ASCII आउटपुट किसी भी ट्रांसपोर्ट में टिकता है। कीमत यह है कि हर गैर-ASCII अक्षर छह अक्षर बन जाता है।
escaping बनाम mojibake
Escaping: \u4e2d\u6587, जो \uXXXX से मेल खाता है। कारण सीरियलाइज़र सेटिंग्स हैं।
Mojibake: 测试, 涓枃। कारण UTF-8 बाइट्स लिखकर उन्हें Latin-1 या GBK के रूप में पढ़ना है।
तेज़ परीक्षण: टेक्स्ट को ब्राउज़र console में JSON.parse('"…"') के रूप में पेस्ट करें। अगर वह पठनीय रूप में वापस आता है, तो escaping था। अगर विफल होता है या विकृत रहता है, तो एन्कोडिंग बेमेल है — और समाधान एन्कोडिंग मिलाना है, सीरियलाइज़र को छूना नहीं।
इसे बंद करना
json.dumps(data, ensure_ascii=False)
फिर डाउनस्ट्रीम सत्यापित करें: कुछ legacy सिस्टम वाकई केवल-ASCII ट्रांसपोर्ट पर निर्भर हैं, विशेषकर SMS gateways और पुराने mail relays।
escaping कब सही विकल्प है
- गैर-ASCII के प्रति शत्रुतापूर्ण ट्रांसपोर्ट (legacy HTTP headers, कुछ SMS gateways)
- किसी अन्य JSON स्ट्रिंग के अंदर नेस्टेड JSON, जहाँ escaping quote टकराव घटाता है
- ऐसी log pipelines जो बाइट्स से truncate करती हैं और multi-byte अक्षर को काट देंगी
अन्यथा, पठनीयता को प्राथमिकता दें और इसे बंद करें।
FAQ
Python डिफ़ॉल्ट रूप से चीनी क्यों escape करता है?
क्योंकि ensure_ascii=True डिफ़ॉल्ट है, जो शुद्ध ASCII आउटपुट की गारंटी देता है जो किसी भी ट्रांसपोर्ट में टिकता है। कीमत यह है कि हर गैर-ASCII अक्षर छह अक्षर बन जाता है।
क्या ensure_ascii बंद करना चाहिए?
जब पठनीयता मायने रखे तो बंद करें। फिर डाउनस्ट्रीम सत्यापित करें — legacy HTTP headers, कुछ SMS gateways और बाइट्स से truncate करने वाली log pipelines अब भी केवल-ASCII सामग्री पर निर्भर हो सकती हैं।
अगर ट्रांसपोर्ट गैर-ASCII नहीं ले जा सकता तो क्या होता है?
escaping रखें। जब JSON किसी अन्य JSON स्ट्रिंग के अंदर एम्बेड हो, या ऐसे चैनल से गुज़रे जो गैर-ASCII के प्रति शत्रुतापूर्ण हो, escaping quote टकराव से बचाता है और multi-byte अक्षरों को बँटने से रोकता है।