समस्या निवारणगाइड
Python में LLM उत्तर प्रिंट करते समय UnicodeEncodeError: 3 समाधान
सिरिलिक या इमोजी पर print(reply) क्रैश होता है? देखें कि रीडायरेक्ट किए गए आउटपुट या लीगेसी कोड पेज के साथ Python क्यों विफल होता है, और इसे UTF-8 मोड, reconfigure या encoding= से ठीक करें।

इस पृष्ठ पर
आपका अनुरोध सफल हुआ, मॉडल ने उत्तर दिया, और फिर Python print(reply) पर क्रैश हो गया। इसमें API की गलती नहीं है। उत्तर ठीक है; जहाँ आप उसे प्रिंट करते हैं, वह उसके कुछ अक्षरों को प्रदर्शित नहीं कर सकता। सबसे तेज़ समाधान है PYTHONUTF8=1 के साथ UTF-8 मोड चालू करना। अगर आप इसे स्क्रिप्ट के अंदर ही रखना चाहते हैं, तो सबसे ऊपर sys. कॉल करें, और जब आप उत्तर को फ़ाइल में सहेजें, तो open() में encoding="utf-8" पास करें।
त्रुटि कैसी दिखती है#
मान लीजिए आप किसी मॉडल से रूसी में प्रश्न पूछते हैं और उत्तर प्रिंट करते हैं। यह पूरी स्क्रिप्ट है, जो हमारी पहली-अनुरोध गाइड से सादे requests कॉल का उपयोग करती है:
import os, requests
r = requests.post(
"https://api.cheaptokens.dev/v1/chat/completions",
headers={"Authorization": f"Bearer {os.environ['CHEAPTOKENS_API_KEY']}"},
json={
"model": "deepseek-ai/DeepSeek-V4-Flash-0731",
"messages": [{"role": "user", "content": "Ответь одним предложением: что такое токен?"}],
"max_tokens": 200,
},
)
reply = r.json()["choices"][0]["message"]["content"]
print(reply)जब stdout को किसी फ़ाइल या पाइप में रीडायरेक्ट किया जाता है, या Python को उसकी स्ट्रीम के लिए किसी लीगेसी कोड पेज के साथ शुरू किया गया था, तो अंतिम पंक्ति इस तरह समाप्त होती है:
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: character maps to <undefined>आपके संदेश में कोडेक का नाम स्ट्रीम के एन्कोडिंग पर निर्भर करता है (Windows कोड पेज के लिए यह आमतौर पर charmap होता है, ascii के लिए ascii), और स्थितियाँ उत्तर पर निर्भर करती हैं। आकार हमेशा एक जैसा होता है: ट्रेसबैक print की ओर इशारा करता है, अनुरोध की ओर नहीं।

ऐसा क्यों होता है? print टेक्स्ट को sys.stdout की एन्कोडिंग का उपयोग करके बाइट्स में बदलता है। अगर वह एन्कोडिंग कोई लीगेसी कोड पेज है, तो उससे बाहर का कोई भी अक्षर, जैसे पश्चिमी कोड पेज में सिरिलिक, कोई इमोजी, कभी-कभी कोई टाइपोग्राफ़िक डैश, के पास बदलने के लिए कोई बाइट नहीं होती। Python अनुमान लगाने के बजाय त्रुटि उठाता है।
यह तीन स्थितियों में सामने आता है:
- stdout रीडायरेक्ट या पाइप किया गया है (
python app.,py > out. txt | another program), या स्क्रिप्ट किसी शेड्यूलर, CI या एडिटर से चल रही है जहाँ stdout कंसोल नहीं है; PYTHONLEGACYWINDOWSSTDIOसेट है, या स्ट्रीम को किसी अन्य तरह से संकीर्ण एन्कोडिंग मिलती है;- आप उत्तर को
open(path, "w")के साथ और बिनाencoding=के फ़ाइल में लिखते हैं।
कौन सा Python? नीचे सब कुछ Python 3.7–3.14 के बारे में है, जहाँ स्ट्रीम और फ़ाइल एन्कोडिंग सिस्टम से आती है। PEP 686 (स्थिति Final, https://peps.python.org/pep-0686/, 5 नवंबर 2026 को जाँचा गया) के अनुसार, Python 3.15 से UTF-8 मोड डिफ़ॉल्ट रूप से चालू है, इसलिए वहाँ open() और stdio पहले से ही UTF-8 का उपयोग करते हैं, जब तक किसी ने इसे PYTHONUTF8=0 या -X utf8=0 से बंद न किया हो। python --version से जाँचें।
जाँचें कि आपके पास वास्तव में कौन सी एन्कोडिंग है#
कुछ भी बदलने से पहले, देखें कि Python ने क्या चुना। इसमें दस सेकंड लगते हैं।
स्वयं आज़माएँइसे आज़माएँ: Python के अनुसार आपकी stdout एन्कोडिंग क्या है?उत्तर दिखाएँ
python - उसी विंडो में चलाएँ जहाँ स्क्रिप्ट विफल होती है। इंटरैक्टिव कंसोल में यह आमतौर पर utf-8 प्रिंट करता है, इसलिए अकेले यह बहुत कम साबित करता है। इसे अंत में > check.txt के साथ फिर चलाएँ और फ़ाइल खोलें: रीडायरेक्ट किया गया आउटपुट ही अधिक बार cp… नाम या ascii देता है, और वही आपका दोषी है। अगर सब कुछ utf-8 कहता है, तो उस फ़ाइल को देखें जिसमें आप लिखते हैं।
किसी बुरे दिन का इंतज़ार किए बिना क्रैश देखना चाहते हैं? macOS या Linux पर, एक बार के लिए संकीर्ण एन्कोडिंग थोपें:
PYTHONIOENCODING=ascii python -c "print('Привет')"यह ascii कोडेक संदेश के साथ विफल होता है, जो ऊपर की त्रुटि के समान परिवार का है। Windows पर इंटरैक्टिव कंसोल के लिए यह वेरिएबल अनदेखा किया जाता है, लेकिन आउटपुट रीडायरेक्ट होने पर यह काम करता है: cmd में set PYTHONIOENCODING=ascii चलाएँ, फिर python - (PowerShell में: $env:PYTHONIOENCODING = "ascii")।
समाधान 1: UTF-8 मोड चालू करें#
Python में एक मोड है जो टेक्स्ट के लिए UTF-8 को डिफ़ॉल्ट बनाता है। Python दस्तावेज़ों (कमांड-लाइन पेज, 5 नवंबर 2026 को जाँचा गया) के अनुसार, PYTHONUTF8=1 इसे चालू करता है और -X utf8 भी वही करता है; दोनों Python 3.7 से मौजूद हैं। उसी पेज से एक चेतावनी: PYTHONUTF8 का कोई भी अन्य गैर-रिक्त मान स्टार्टअप पर त्रुटि उत्पन्न करता है, इसलिए ठीक 1 का उपयोग करें (या इसे बंद करने के लिए 0)। 3.15 पर आपको यह केवल पुराने इंटरप्रेटरों पर मोड को स्पष्ट रूप से सक्षम करने के लिए चाहिए; अगर वहाँ यह पहले से चालू है, तो अपने वातावरण में PYTHONUTF8=0 खोजें।
एक बार के लिए UTF-8 मोड चालू करें
cmd
set PYTHONUTF8=1
python app.pyPowerShell
$env:PYTHONUTF8 = "1"
python app.pymacOS / Linux
PYTHONUTF8=1 python app.pyकोई कोड परिवर्तन नहीं, और यह उस रन में कंसोल, रीडायरेक्ट और फ़ाइलों को कवर करता है। अगर आप हर बार वेरिएबल सेट नहीं करना चाहते, तो python - कमांड लाइन से वही परिणाम देता है।
PYTHONIOENCODING=utf- भी है, जो केवल stdin, stdout और stderr की एन्कोडिंग को ओवरराइड करता है। Windows पर इस पर भरोसा करने से पहले इसकी दस्तावेज़ प्रविष्टि पढ़ें: Python 3.6 से यह इंटरैक्टिव कंसोल बफ़र के लिए अनदेखा किया जाता है, जब तक PYTHONLEGACYWINDOWSSTDIO सेट न हो। रीडायरेक्ट की गई फ़ाइलें और पाइप उस अपवाद से प्रभावित नहीं होते। इसलिए यह python app. को ठीक कर सकता है और फिर भी कंसोल विंडो में कुछ नहीं कर सकता। stderr के लिए त्रुटि हैंडलर हमेशा backslashreplace होता है।
समाधान 2: स्क्रिप्ट के अंदर stdout को पुनः कॉन्फ़िगर करें#
अगर आप नियंत्रित नहीं कर सकते कि लोग स्क्रिप्ट कैसे शुरू करते हैं, तो स्ट्रीम को सबसे ऊपर ही बदलें:
import sys
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")
print(reply)reconfigure का दस्तावेज़ीकरण io.TextIOWrapper के लिए है (3.7 में जोड़ा गया)। जब आप encoding पास करते हैं और errors छोड़ देते हैं, तो हैंडलर strict होता है, इसलिए जो अक्षर फ़िट नहीं होता वह अभी भी त्रुटि उठाता है; UTF-8 के सामान्य मामले में कुछ भी शेष नहीं बचता। दस्तावेज़ों से दो विवरण: स्ट्रीम से डेटा पढ़े जाने के बाद एन्कोडिंग नहीं बदली जा सकती (लिखने के बाद बदली जा सकती है), और encoding="locale" 3.11 से समर्थित है।
स्क्रिप्ट को कभी क्रैश न होने की ज़रूरत है, ऐसे टर्मिनल पर भी जो वास्तव में टेक्स्ट नहीं दिखा सकता? errors="replace" जोड़ें। अज्ञात अक्षर तब रन रोकने के बजाय ? के रूप में दिखाई देते हैं। यह समस्या को ठीक करने के बजाय छिपाता है, इसलिए इसे लॉग के लिए रखें।
समाधान 3: फ़ाइलों को स्पष्ट एन्कोडिंग दें#
उत्तर सहेजना वही विफलता है, बस कोड में अधिक शांत:
# before: on Python up to 3.14 this uses the system's default encoding
with open("reply.txt", "w") as f:
f.write(reply)
# after: the file is UTF-8 on every machine
with open("reply.txt", "w", encoding="utf-8") as f:
f.write(reply)जब आप फ़ाइल को वापस पढ़ें तो वही encoding="utf-8" उपयोग करें, अन्यथा टेक्स्ट अंदर आते समय टूट सकता है।

आपको कौन सा समाधान उपयोग करना चाहिए?#
अपना मामला चुनें
अपना मामला चुनें
उत्तर देखने के लिए एक विकल्प चुनें
मैं अपनी स्क्रिप्ट टर्मिनल में चलाता हूँ
अपने वातावरण में एक बार PYTHONUTF8=1 सेट करें, या python - के साथ शुरू करें। कोड में कुछ नहीं बदलता।
मैं स्क्रिप्ट दूसरों को देता हूँ
सबसे ऊपर sys. रखें, ताकि वे इसे जैसे भी लॉन्च करें, यह काम करे।
क्रैश स्क्रीन पर नहीं, फ़ाइल पर है
लिखने और पढ़ने दोनों के लिए open() में encoding="utf-8" जोड़ें।
आप इन्हें जोड़ सकते हैं। जो स्क्रिप्ट उत्तर प्रिंट और सहेजती है, उसे स्क्रीन के लिए समाधान 2 या समाधान 1 और फ़ाइल के लिए समाधान 3 चाहिए।
अगर फिर भी विफल हो#
- त्रुटि किसी दूसरी पंक्ति पर चली गई। तो विफल होने वाला कॉल कोई अन्य
printयाwriteहै; समाधान उसके चलने से पहले लागू होना चाहिए, इसलिएreconfigureसबसे ऊपर रखें। - त्रुटि
PYTHONUTF8का उल्लेख करती है। वेरिएबल का मान1या0के अलावा कुछ और है। इसे हटाएँ और फिर से सेट करें। - कोई क्रैश नहीं, लेकिन आपको कंसोल में वर्ग या
?दिखते हैं। Python ने मान्य UTF-8 लिखा; कंसोल फ़ॉन्ट या कोड पेज इसे प्रदर्शित नहीं कर सकता। पुष्टि करने के लिए किसी फ़ाइल में रीडायरेक्ट करें और फ़ाइल को एडिटर में खोलें कि उत्तर अक्षुण्ण है। - त्रुटि
UnicodeEncodeErrorनहीं,JSONDecodeErrorहै। अलग समस्या: देखें मॉडल उत्तर से JSON कैसे निकालें।
ऊपर का अनुरोध कोड सादा requests कॉल है; CheapTokens दस्तावेज़ OpenAI SDK के लिए वही कॉल दिखाते हैं। दूसरा मॉडल भी उसी समाधान के साथ काम करता है: model फ़ील्ड को zai- से बदलें (प्रति उत्तर अधिकतम 8,192 आउटपुट टोकन, 390K संदर्भ)। एन्कोडिंग त्रुटि का मॉडल से कोई लेना-देना नहीं है, केवल इससे कि टेक्स्ट कहाँ जाता है।



