ব্লগে ফিরে যান

সমস্যা সমাধানগাইড

Python-এ একটি LLM উত্তর প্রিন্ট করার সময় UnicodeEncodeError: ৩টি সমাধান

print(reply) সিরিলিক বা ইমোজিতে ক্র্যাশ করে? কেন Python পুনর্নির্দেশিত আউটপুট বা একটি লিগ্যাসি কোড পেজে ব্যর্থ হয় তা দেখুন, এবং UTF-8 মোড, reconfigure বা encoding= দিয়ে ঠিক করুন।

CheapTokens Team দ্বারাপ্রকাশিত হয়েছে 11 মিনিট পড়ার সময়

print(reply)-এ UnicodeEncodeError এবং UTF-8 সমাধান, একটি ত্রুটি কার্ড হিসাবে আঁকা
এই পৃষ্ঠায়
  1. ত্রুটিটি কেমন দেখায়
  2. আপনার আসলে কোন এনকোডিং আছে তা যাচাই করুন
  3. সমাধান ১: UTF-8 মোড চালু করুন
  4. সমাধান ২: স্ক্রিপ্টের ভিতরে stdout পুনরায় কনফিগার করুন
  5. সমাধান ৩: ফাইলগুলিকে একটি স্পষ্ট এনকোডিং দিন
  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")।

সমাধান ১: 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।

সমাধান ২: স্ক্রিপ্টের ভিতরে 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" যোগ করুন। অজানা অক্ষরগুলি তখন রান থামানোর পরিবর্তে ? হিসাবে উপস্থিত হয়। এটি সমস্যাটি ঠিক করার পরিবর্তে লুকিয়ে রাখে, তাই এটি লগের জন্য রাখুন।

সমাধান ৩: ফাইলগুলিকে একটি স্পষ্ট এনকোডিং দিন#

একটি উত্তর সংরক্ষণ করা একই ব্যর্থতা, শুধুমাত্র কোডে আরও শান্ত:

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" যোগ করুন।

আপনি সেগুলি একত্রিত করতে পারেন। যে স্ক্রিপ্টটি উত্তর প্রিন্ট এবং সংরক্ষণ করে তার জন্য স্ক্রিনের জন্য সমাধান ২ বা সমাধান ১ এবং ফাইলের জন্য সমাধান ৩ প্রয়োজন।

যদি এটি এখনও ব্যর্থ হয়#

  • ত্রুটি একটি ভিন্ন লাইনে চলে গেছে। তাহলে ব্যর্থ কলটি অন্য একটি 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 কনটেক্সট)। এনকোডিং ত্রুটির মডেলের সাথে কোনো সম্পর্ক নেই, শুধুমাত্র পাঠ্যটি কোথায় যায় তার সাথে।