بلاگ پر واپس جائیں

خرابیوں کا ازالہگائیڈ

Python میں LLM جواب پرنٹ کرتے وقت UnicodeEncodeError: 3 حل

print(reply) سیریلک یا ایموجی پر کریش ہو رہا ہے؟ دیکھیں Python ری ڈائریکٹ شدہ آؤٹ پٹ یا لیگیسی کوڈ پیج کے ساتھ کیوں ناکام ہوتا ہے، اور اسے UTF-8 موڈ، reconfigure یا encoding= سے ٹھیک کریں۔

از CheapTokens Teamشائع شدہ 7 منٹ کا مطالعہ

print(reply) پر UnicodeEncodeError اور UTF-8 حل، ایک ایرر کارڈ کے طور پر دکھایا گیا
اس صفحہ پر
  1. خرابی کیسی دکھتی ہے
  2. چیک کریں کہ آپ کے پاس اصل میں کون سی انکوڈنگ ہے
  3. حل 1: UTF-8 موڈ آن کریں
  4. حل 2: اسکرپٹ کے اندر stdout کو دوبارہ کنفیگر کریں
  5. حل 3: فائلوں کو واضح انکوڈنگ دیں
  6. آپ کو کون سا حل استعمال کرنا چاہیے؟
  7. اگر پھر بھی ناکام ہو

آپ کی درخواست گزر گئی، ماڈل نے جواب دیا، اور پھر Python print(reply) پر مر گیا۔ API قصوروار نہیں ہے۔ جواب ٹھیک ہے؛ جہاں آپ اسے پرنٹ کرتے ہیں وہ اس کے کچھ حروف کی نمائندگی نہیں کر سکتا۔ سب سے تیز حل یہ ہے کہ PYTHONUTF8=1 کے ساتھ UTF-8 موڈ آن کریں۔ اگر آپ اسے اسکرپٹ کے اندر رکھنا پسند کرتے ہیں، تو اوپر sys.stdout.reconfigure(encoding="utf-8") کال کریں، اور جب آپ جواب کو فائل میں محفوظ کریں تو open() کو encoding="utf-8" پاس کریں۔

خرابی کیسی دکھتی ہے#

فرض کریں آپ کسی ماڈل سے روسی میں سوال پوچھتے ہیں اور جواب پرنٹ کرتے ہیں۔ یہ پورا اسکرپٹ ہے، جو ہماری پہلی درخواست گائیڈ سے سادہ requests کال استعمال کرتا ہے:

python
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 کو اس کے اسٹریمز کے لیے لیگیسی کوڈ پیج کے ساتھ شروع کیا گیا ہو، تو آخری سطر اس طرح ختم ہوتی ہے:

text
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-5: character maps to <undefined>

آپ کے پیغام میں کوڈیک کا نام اسٹریم کی انکوڈنگ پر منحصر ہے (Windows کوڈ پیج کے لیے یہ عام طور پر charmap ہوتا ہے، ascii کے لیے یہ ascii ہے)، اور پوزیشنیں جواب پر منحصر ہیں۔ شکل ہمیشہ ایک جیسی ہوتی ہے: ٹریس بیک print کی طرف اشارہ کرتا ہے، درخواست کی طرف نہیں۔

print(reply) کی طرف اشارہ کرنے والا UnicodeEncodeError ٹریس بیک
خرابی کی عام شکل: یہ print کی طرف سے اٹھائی جاتی ہے، API کال پہلے ہی کامیاب ہو چکی ہوتی ہے

یہ کیوں ہوتا ہے؟ 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 -c "import sys; print(sys.stdout.encoding)" اسی ونڈو میں چلائیں جہاں اسکرپٹ ناکام ہوتا ہے۔ انٹرایکٹو کنسول میں یہ عام طور پر utf-8 پرنٹ کرتا ہے، لہذا صرف یہ بہت کم ثابت کرتا ہے۔ اسے آخر میں > check.txt کے ساتھ دوبارہ چلائیں اور فائل کھولیں: ری ڈائریکٹ شدہ آؤٹ پٹ ہی زیادہ تر cp… نام یا ascii دیتا ہے، اور وہی آپ کا مجرم ہے۔ اگر سب کچھ utf-8 کہتا ہے، تو اس فائل کو دیکھیں جس میں آپ لکھتے ہیں۔

برا دن آنے کا انتظار کیے بغیر کریش دیکھنا چاہتے ہیں؟ macOS یا Linux پر، ایک رن کے لیے تنگ انکوڈنگ زبردستی لگائیں:

bash
PYTHONIOENCODING=ascii python -c "print('Привет')"

یہ ascii کوڈیک پیغام کے ساتھ ناکام ہوتا ہے، جو اوپر کی خرابی کے اسی خاندان سے ہے۔ Windows پر انٹرایکٹو کنسول کے لیے یہ ویری ایبل نظر انداز کیا جاتا ہے، لیکن جب آؤٹ پٹ ری ڈائریکٹ ہو تو یہ کام کرتا ہے: cmd میں set PYTHONIOENCODING=ascii چلائیں، پھر python -c "print('Привет')" > out.txt (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

bat
set PYTHONUTF8=1
python app.py

PowerShell

powershell
$env:PYTHONUTF8 = "1"
python app.py

macOS / Linux

bash
PYTHONUTF8=1 python app.py

کوئی کوڈ تبدیلی نہیں، اور یہ اس رن میں کنسول، ری ڈائریکٹس اور فائلوں کو کور کرتا ہے۔ اگر آپ ہر بار ویری ایبل سیٹ نہیں کرنا چاہتے، تو python -X utf8 app.py کمانڈ لائن سے وہی نتیجہ دیتا ہے۔

PYTHONIOENCODING=utf-8 بھی ہے، جو صرف stdin، stdout اور stderr کی انکوڈنگ کو اوور رائیڈ کرتا ہے۔ Windows پر اس پر انحصار کرنے سے پہلے اس کا ڈاکس اندراج پڑھیں: Python 3.6 سے یہ انٹرایکٹو کنسول بفر کے لیے نظر انداز کیا جاتا ہے جب تک PYTHONLEGACYWINDOWSSTDIO سیٹ نہ ہو۔ ری ڈائریکٹ شدہ فائلیں اور پائپ اس استثنا سے متاثر نہیں ہوتے۔ لہذا یہ python app.py > out.txt ٹھیک کر سکتا ہے اور پھر بھی کنسول ونڈو میں کچھ نہیں کرتا۔ stderr کے لیے ایرر ہینڈلر ہمیشہ backslashreplace ہوتا ہے۔

حل 2: اسکرپٹ کے اندر stdout کو دوبارہ کنفیگر کریں#

اگر آپ کنٹرول نہیں کر سکتے کہ لوگ اسکرپٹ کیسے شروع کرتے ہیں، تو بالکل اوپر اسٹریم ہی تبدیل کریں:

python
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: فائلوں کو واضح انکوڈنگ دیں#

جواب محفوظ کرنا وہی ناکامی ہے، صرف کوڈ میں زیادہ خاموش:

python
# 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" استعمال کریں، ورنہ متن اندر آنے کے راستے میں ٹوٹ سکتا ہے۔

پہلے: print(reply) UnicodeEncodeError اٹھاتا ہے۔ بعد میں: وہی سطر پورا جواب پرنٹ کرتی ہے
وہی print سطر، UTF-8 موڈ سے پہلے اور بعد میں

آپ کو کون سا حل استعمال کرنا چاہیے؟#

اپنا کیس منتخب کریں

اپنا معاملہ چنیں

میں اپنا اسکرپٹ ٹرمینل میں چلاتا ہوں

اپنے ماحول میں ایک بار PYTHONUTF8=1 سیٹ کریں، یا python -X utf8 app.py کے ساتھ شروع کریں۔ کوڈ میں کچھ نہیں بدلتا۔

میں اسکرپٹ دوسرے لوگوں کو دیتا ہوں

اوپر sys.stdout.reconfigure(encoding="utf-8") رکھیں، تاکہ یہ کام کرے چاہے وہ اسے کیسے بھی لانچ کریں۔

کریش فائل پر ہے، اسکرین پر نہیں

open() میں encoding="utf-8" شامل کریں، لکھنے اور پڑھنے دونوں کے لیے۔

آپ انہیں یکجا کر سکتے ہیں۔ ایک اسکرپٹ جو جوابات پرنٹ اور محفوظ کرتا ہے اسے اسکرین کے لیے حل 2 یا حل 1 اور فائل کے لیے حل 3 کی ضرورت ہے۔

اگر پھر بھی ناکام ہو#

  • خرابی کسی مختلف سطر پر منتقل ہو گئی۔ پھر ناکام ہونے والی کال کوئی اور print یا write ہے؛ حل اس کے چلنے سے پہلے لاگو ہونا چاہیے، لہذا reconfigure بالکل اوپر رکھیں۔
  • خرابی PYTHONUTF8 کا ذکر کرتی ہے۔ ویری ایبل کی قدر 1 یا 0 کے علاوہ کچھ اور ہے۔ اسے ہٹائیں اور دوبارہ سیٹ کریں۔
  • کوئی کریش نہیں، لیکن آپ کو کنسول میں مربع یا ? نظر آتے ہیں۔ Python نے درست UTF-8 لکھا؛ کنسول فونٹ یا کوڈ پیج اسے دکھا نہیں سکتا۔ فائل میں ری ڈائریکٹ کریں اور تصدیق کے لیے فائل کو ایڈیٹر میں کھولیں کہ جواب برقرار ہے۔
  • خرابی JSONDecodeError ہے، UnicodeEncodeError نہیں۔ مختلف مسئلہ: ماڈل کے جواب سے JSON کیسے نکالیں دیکھیں۔

اوپر کا درخواست کوڈ سادہ requests کال ہے؛ CheapTokens ڈاکس OpenAI SDK کے لیے وہی کال دکھاتے ہیں۔ دوسرا ماڈل اسی حل کے ساتھ کام کرتا ہے: model فیلڈ کو zai-org/GLM-5.3-Flash سے بدلیں (فی جواب زیادہ سے زیادہ 8,192 آؤٹ پٹ ٹوکن، 390K کانٹیکسٹ)۔ انکوڈنگ کی خرابی کا ماڈل سے کوئی تعلق نہیں، صرف اس سے کہ متن کہاں جاتا ہے۔