ফাইলটিতে পুনর্নির্দেশের সময় ইউনিকোডডেকোডেরর


100

আমি এই স্নিপেটটি দুবার চালিয়েছি উবুন্টু টার্মিনালে (এনকোডিংটি utf-8 এ সেট করুন) একবার ./test.pyএবং এর সাথে ./test.py >out.txt:

uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni

পুনঃনির্দেশ ছাড়াই এটি আবর্জনা মুদ্রণ করে। পুনঃনির্দেশের সাথে আমি একটি ইউনিকোড ডিকোড এরির পাই। কেউ কীভাবে ব্যাখ্যা করতে পারে যে আমি কেবল দ্বিতীয় ক্ষেত্রে ত্রুটিটি পেয়েছি, বা উভয় ক্ষেত্রেই পর্দার আড়ালে কী চলছে তার একটি বিশদ ব্যাখ্যা দিতে পারি?


এই উত্তরটিও সহায়ক হতে পারে।
tzot

আমি যখন আপনার সন্ধানের প্রতিলিপি তৈরির চেষ্টা করব তখন আমি একটি ইউনিকোডডিনকোডেরর না হয়ে একটি ইউনিকোডইনকোর্ডার পেয়েছি। gist.github.com/jaraco/12abfc05872c65a4f3f6cd58b6f9be4d
জেসন

উত্তর:


252

এই জাতীয় এনকোডিং সমস্যার পুরো কীটি বুঝতে হবে যে নীতিগতভাবে "স্ট্রিং" এর দুটি স্বতন্ত্র ধারণা রয়েছে : (1) অক্ষরের স্ট্রিং , এবং (2) স্ট্রিং / বাইটের অ্যারে। 256 টির বেশি অক্ষরবিহীন এনকোডিংগুলির uতিহাসিক সর্বব্যাপীতার কারণে এই পার্থক্যটি বেশিরভাগ সময় ধরে উপেক্ষা করা হয়েছে (এএসসিআইআই, ল্যাটিন -১, উইন্ডোজ -১২২২, ম্যাক ওএস রোমান, ...): এই এনকোডিংগুলি সাধারণ অক্ষরের একটি সেটকে ম্যাপ করে 0 এবং 255 (অর্থাত্ বাইট) এর মধ্যে সংখ্যা; ওয়েবের আবির্ভাবের আগে ফাইলগুলির অপেক্ষাকৃত সীমিত বিনিময়টি বেমানান এনকোডিংগুলির এই পরিস্থিতিকে সহনীয় করে তুলেছিল, কারণ বেশিরভাগ প্রোগ্রাম একই অপারেটিং সিস্টেমে থাকা টেক্সট তৈরি করে যতক্ষণ না একাধিক এনকোডিং থাকত এ বিষয়টি উপেক্ষা করতে পারে: এই জাতীয় প্রোগ্রামগুলি সহজভাবে বাইট হিসাবে টেক্সট আচরণ (অপারেটিং সিস্টেম দ্বারা ব্যবহৃত এনকোডিং মাধ্যমে)। সঠিক, আধুনিক দৃষ্টিভঙ্গি নিম্নলিখিত দুটি পয়েন্টের উপর ভিত্তি করে এই দুটি স্ট্রিং ধারণাটি যথাযথভাবে পৃথক করেছে:

  1. অক্ষরগুলি বেশিরভাগ কম্পিউটারের সাথে সম্পর্কিত নয় : উদাহরণস্বরূপ بايثون, 中 蟒 এবং 🐍 এর মতো একটি এটি একটি খড়ি বোর্ড ইত্যাদিতে আঁকতে পারে 🐍 মেশিনগুলির "অক্ষর" এর মধ্যে "অঙ্কন নির্দেশাবলী" অন্তর্ভুক্ত থাকে যেমন উদাহরণস্বরূপ স্পেস, ক্যারেজ রিটার্ন, লেখার দিকনির্ধারণের নির্দেশাবলী (আরবি ইত্যাদির জন্য) ইত্যাদি, অ্যাকসেন্ট ইত্যাদি A ইউনিকোড স্ট্যান্ডার্ডের মধ্যে একটি খুব বড় চরিত্রের তালিকা অন্তর্ভুক্ত ; এটি বেশিরভাগ পরিচিত চরিত্রগুলি জুড়ে covers

  2. অন্যদিকে, কম্পিউটারগুলিকে কোনও উপায়ে বিমূর্ত অক্ষরগুলি উপস্থাপন করা দরকার: এর জন্য তারা বাইটের অ্যারে ব্যবহার করে (0 থেকে 255 এর মধ্যে সংখ্যাগুলি অন্তর্ভুক্ত), কারণ তাদের স্মৃতি বাইট খণ্ডে আসে। অক্ষরকে বাইটে রূপান্তরিত করে এমন প্রয়োজনীয় প্রক্রিয়াটিকে এনকোডিং বলা হয় । সুতরাং, কম্পিউটারের অক্ষর উপস্থাপনের জন্য একটি এনকোডিং প্রয়োজন । আপনার কম্পিউটারে উপস্থিত যে কোনও পাঠ্য এনকোডড রয়েছে (এটি প্রদর্শিত না হওয়া অবধি), এটি কোনও টার্মিনালে প্রেরণ করা হয়েছে (যা একটি নির্দিষ্ট উপায়ে এনকোড করা অক্ষরগুলির প্রত্যাশা করে) বা কোনও ফাইলে সংরক্ষণ করা হয়। প্রদর্শিত বা সঠিকভাবে "বোঝার" জন্য (পাইথন ইন্টারপ্রেটার দ্বারা, বলুন), বাইটগুলির স্রোতগুলিকে অক্ষরগুলিতে ডিকোড করা হয়। কয়েকটি এনকোডিং(ইউটিএফ -8, ইউটিএফ -16,…) এর অক্ষরগুলির তালিকা জন্য ইউনিকোড দ্বারা সংজ্ঞায়িত করা হয়েছে (ইউনিকোড এভাবে এই অক্ষরগুলির জন্য অক্ষরগুলির একটি তালিকা এবং এনকোডিং উভয়ই সংজ্ঞায়িত করে — এখনও এমন জায়গা রয়েছে যেখানে কেউ "ইউনিকোড এনকোডিং" হিসাবে অভিব্যক্তিটি দেখেছেন সর্বব্যাপী ইউটিএফ -8 উল্লেখ করার উপায়, তবে এটি ভুল পরিভাষা, যেমন ইউনিকোড একাধিক এনকোডিং সরবরাহ করে)।

সংক্ষেপে, কম্পিউটারগুলির অভ্যন্তরীণভাবে বাইটগুলি সহ অক্ষরগুলি উপস্থাপন করা প্রয়োজন এবং তারা দুটি ক্রিয়াকলাপের মাধ্যমে এটি করে:

এনকোডিং : অক্ষর → বাইট

ডিকোডিং : বাইটস → অক্ষর

কিছু এনকোডিং সমস্ত অক্ষরকে এনকোড করতে পারে না (যেমন, ASCII), (কিছু) ইউনিকোড এনকোডিংগুলি আপনাকে সমস্ত ইউনিকোড অক্ষর এনকোড করার অনুমতি দেয়। এনকোডিং অগত্যা অনন্যও নয় , কারণ কিছু অক্ষর প্রত্যক্ষভাবে বা সংমিশ্রণ হিসাবে উপস্থাপিত হতে পারে (যেমন একটি বেস চরিত্র এবং অ্যাকসেন্টের উদাহরণস্বরূপ)।

নোট করুন যে নিউলাইন ধারণাটি জটিলতার একটি স্তর যুক্ত করে , যেহেতু এটি অপারেটিং সিস্টেমের উপর নির্ভরশীল বিভিন্ন (নিয়ন্ত্রণ) অক্ষর দ্বারা প্রতিনিধিত্ব করা যেতে পারে (এটি পাইথনের সর্বজনীন নিউলাইন ফাইল রিডিং মোডের কারণ )।

এখন, আমি উপরে "অক্ষর" বলেছি যা ইউনিকোডকে " ব্যবহারকারী-অনুভূত চরিত্র " বলে। ইউনিকোড তালিকার বিভিন্ন সূচীতে পাওয়া অক্ষরের অংশসমূহ (বেস অক্ষর, অ্যাকসেন্টস,…) একত্রিত করে একটি ইউজার-বোধিত অক্ষরকে ইউনিকোডে প্রতিনিধিত্ব করা যেতে পারে , যা " কোড পয়েন্ট " নামে পরিচিত - এই কোড পয়েন্টগুলি একত্রিত করে গঠন করতে পারে একটি "গ্রাফি ক্লাস্টার"। ইউনিকোড এভাবে স্ট্রিংয়ের তৃতীয় ধারণার দিকে নিয়ে যায় যা ইউনিকোড কোড পয়েন্টের ক্রম দিয়ে তৈরি হয়, যা বাইট এবং চরিত্রের স্ট্রিংগুলির মধ্যে বসে থাকে এবং এটি পরবর্তীটির কাছাকাছি থাকে। আমি তাদের " ইউনিকোড স্ট্রিংস " বলব (পাইথন 2 এর মতো)।

পাইথন অক্ষরগুলির স্ট্রিং (ব্যবহারকারী-অনুভূত) মুদ্রণ করতে পারে, পাইথন নন-বাইট স্ট্রিংগুলি ইউনিকোড কোড পয়েন্টগুলির মূলত ক্রম , ব্যবহারকারীর দ্বারা উপলব্ধ অক্ষরের নয়। কোড পয়েন্টের মানগুলি পাইথন \uএবং \Uইউনিকোড স্ট্রিং সিনট্যাক্সে ব্যবহৃত হয় । কোনও চরিত্রের এনকোডিংয়ের সাথে তাদের বিভ্রান্ত করা উচিত নয় (এবং এর সাথে কোনও সম্পর্ক বহন করতে হবে না: ইউনিকোড কোড পয়েন্টগুলি বিভিন্ন উপায়ে এনকোড করা যেতে পারে)।

এটি একটি গুরুত্বপূর্ণ ফল আছে: একটি পাইথন (ইউনিকোড) স্ট্রিং এর দৈর্ঘ্য কোড পয়েন্ট তার সংখ্যা, যার হয় না সবসময় ব্যবহারকারী-অনুভূত অক্ষরের তার সংখ্যা এইভাবে: s = "\u1100\u1161\u11a8"; print(s, "len", len(s))(পাইথন 3) দেয় 각 len 3সত্ত্বেও sএকটি একক ব্যবহারকারী-অনুভূত (কোরিয়ান) এটি অক্ষর (কারণ এটি 3 কোড পয়েন্টের সাথে উপস্থাপিত — এমনকি এটির যেমন print("\uac01")শো-তে না হয়)। যাইহোক, অনেক ব্যবহারিক পরিস্থিতিতে স্ট্রিংয়ের দৈর্ঘ্য হ'ল এটি ব্যবহারকারী-অনুভূত অক্ষরের সংখ্যা, কারণ অনেকগুলি অক্ষর সাধারণত পাইথন একটি একক ইউনিকোড কোড পয়েন্ট হিসাবে সংরক্ষণ করে।

ইন পাইথন 2 , ইউনিকোড স্ট্রিং বলা হয় ... "ইউনিকোড স্ট্রিং" ( unicodeধরন, আক্ষরিক ফর্ম u"…"), এবং বাইট অ্যারে "স্ট্রিং" (হয় strধরন, যেখানে বাইট অ্যারে উদাহরণস্বরূপ স্ট্রিং লিটারেল দিয়ে অঙ্কণ করা সম্ভব "…")। ইন পাইথন 3 , ইউনিকোড স্ট্রিং শুধু "স্ট্রিং" (বলা হয় strধরন, আক্ষরিক ফর্ম "…",) যখন বাইট অ্যারে "বাইট" (হয় bytesধরন, আক্ষরিক ফর্ম b"…")। ফলস্বরূপ, এর মতো কিছু "🐍"[0]পাইথন 2 ( '\xf0', একটি বাইট) এবং পাইথন 3 ( "🐍"প্রথম এবং একমাত্র চরিত্র) এ আলাদা ফলাফল দেয় ।

এই কয়েকটি মূল পয়েন্টের সাহায্যে আপনার বেশিরভাগ এনকোডিং সম্পর্কিত প্রশ্নগুলি বুঝতে সক্ষম হওয়া উচিত!


সাধারণত আপনি যখন কোনও টার্মিনালে মুদ্রণ করেন তখন আপনার আবর্জনা ফেলা উচিত নয়: পাইথন আপনার টার্মিনালের এনকোডিংটি জানে। আসলে, আপনি টার্মিনালটি কী এনকোডিংয়ের প্রত্যাশা করে তা পরীক্ষা করতে পারেন:u"…"

% python
Python 2.7.6 (default, Nov 15 2013, 15:20:37) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.stdout.encoding
UTF-8

যদি আপনার ইনপুট অক্ষরগুলি টার্মিনালের এনকোডিংয়ের সাথে এনকোড করা যায় তবে পাইথন তা করবে এবং কোনও অভিযোগ না করে আপনার টার্মিনালে সংশ্লিষ্ট বাইটগুলি প্রেরণ করবে। টার্মিনাল তারপরে ইনপুট বাইটগুলি ডিকোড করার পরে অক্ষরগুলি প্রদর্শনের জন্য যথাসাধ্য চেষ্টা করবে (সবচেয়ে খারাপভাবে টার্মিনাল ফন্টে কিছু অক্ষর নেই এবং পরিবর্তে কিছু প্রকার ফাঁকা মুদ্রণ করা হবে)।

যদি আপনার ইনপুট অক্ষরগুলি টার্মিনালের এনকোডিংয়ের সাথে এনকোড করা যায় না, তবে এর অর্থ হ'ল এই অক্ষরগুলি প্রদর্শনের জন্য টার্মিনালটি কনফিগার করা হয়নি। পাইথন অভিযোগ করবে (পাইথনের সাথে UnicodeEncodeErrorযেহেতু অক্ষরের স্ট্রিংটি এমনভাবে এনকোড করা যায় না যেটি আপনার টার্মিনালের সাথে মানানসই)। একমাত্র সম্ভাব্য সমাধান হ'ল একটি টার্মিনাল ব্যবহার করা যা অক্ষরগুলি প্রদর্শন করতে পারে (হয় টার্মিনালটি কনফিগার করে যাতে এটি এমন একটি এনকোডিং গ্রহণ করে যা আপনার অক্ষরগুলিকে উপস্থাপন করতে পারে, বা কোনও ভিন্ন টার্মিনাল প্রোগ্রাম ব্যবহার করে)। আপনি যখন বিভিন্ন পরিবেশে ব্যবহার করা যেতে পারে এমন প্রোগ্রামগুলি বিতরণ করেন তখন এটি গুরুত্বপূর্ণ: আপনি যে মুদ্রণগুলি মুদ্রণ করেন তা ব্যবহারকারীর টার্মিনালে উপস্থাপনযোগ্য হওয়া উচিত। কখনও কখনও স্ট্রিংগুলিতে লেগে থাকা ভাল তবে কেবল ASCII অক্ষর রয়েছে।

যাইহোক, আপনি যখন আপনার প্রোগ্রামের আউটপুটটিকে পুনঃনির্দেশিত করেন বা পাইপ করেন , তখন সাধারণত প্রাপ্তি প্রোগ্রামের ইনপুট এনকোডিংটি কী তা জানা সম্ভব নয় এবং উপরের কোডটি কিছু ডিফল্ট এনকোডিং দেয়: কিছুই নেই (পাইথন ২.7) বা ইউটিএফ -৮ ( পাইথন 3):

% python2.7 -c "import sys; print sys.stdout.encoding" | cat
None
% python3.4 -c "import sys; print(sys.stdout.encoding)" | cat
UTF-8

স্টিন, স্টডআউট এবং স্ট্ডার এর এনকোডিং তবে প্রয়োজনে পরিবেশের পরিবর্তনশীল মাধ্যমে নির্ধারণ করা যেতে পারে PYTHONIOENCODING:

% PYTHONIOENCODING=UTF-8 python2.7 -c "import sys; print sys.stdout.encoding" | cat
UTF-8

যদি কোনও টার্মিনালে মুদ্রণ আপনি যা প্রত্যাশা করেন তা উত্পাদিত না করে আপনি নিজে ইউটিএফ -8 এনকোডিং যা আপনি ম্যানুয়ালি রেখেছিলেন তা সঠিকভাবে পরীক্ষা করতে পারেন; উদাহরণস্বরূপ, যদি আপনার ভুল না হয় তবে আপনার প্রথম অক্ষর ( \u001A) মুদ্রণযোগ্য নয়

http://wiki.python.org/moin/PrintFails , আপনি পাইথন 2.x জন্য নিচের মত একটি সমাধান, পেতে পারবেন:

import codecs
import locale
import sys

# Wrap sys.stdout into a StreamWriter to allow writing unicode.
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout) 

uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni

পাইথন 3 এর জন্য, আপনি স্ট্যাকওভারফ্লোতে পূর্বে জিজ্ঞাসিত প্রশ্নগুলির একটি চেক করতে পারেন ।


2
@ আসন্নতা: ধন্যবাদ! পাইথন 3
এরিক ও লেবিগোট

2
আপনি মানুষ ধন্যবাদ! আমার এত দীর্ঘ সময়ের জন্য এই ব্যাখ্যাটির প্রয়োজন ছিল ... এটি একটি দুঃখের বিষয় যা আমি আপনাকে কেবল একটি উঁচুতে দিতে পারি।
mik01aj

3
@ এম01, আমি সাহায্য করতে পেরে আনন্দিত! এই উত্তরটি লেখার জন্য একটি অনুপ্রেরণা হ'ল ওয়েবে ইউনিকোড এবং পাইথন সম্পর্কে অনেকগুলি পৃষ্ঠাগুলি ছিল তবে আমি দেখতে পেলাম যে আকর্ষণীয় হওয়া সত্ত্বেও তারা কখনই আমাকে কংক্রিটের এনকোডিংয়ের সমস্যাগুলি সম্পূর্ণরূপে সমাধান করতে দেয়নি ... আমি সত্যই বিশ্বাস করি যে এই বিষয়টি মাথায় রেখেই এই উত্তরের নীতিগুলি পাওয়া গেছে এবং কংক্রিটের এনকোডিংয়ের সমস্যাগুলি সমাধান করার সময় সেগুলি ব্যবহার করতে সময় নেওয়া অনেক সহায়তা করে।
এরিক হে লেবিগোট

3
এটি এখন পর্যন্ত ইউনিকোড এবং অজগরটির সর্বোত্তম ব্যাখ্যার হাত ধরে। পাইথন ইউনিকোড হাওটো এর সাথে প্রতিস্থাপন করা উচিত।
stantonk

1
এখানে, আমাকে এই চকবোর্ডে "ডান থেকে বাম ওভাররাইড" চরিত্রটি আঁকতে দাও ...
icttoofay

20

টার্মিনাল, ফাইল, পাইপ ইত্যাদিতে লেখার সময় পাইথন সর্বদা ইউনিকোড স্ট্রিংগুলি এনকোড করে থাকে যখন টার্মিনালে লেখার সময় পাইথন সাধারণত টার্মিনালের এনকোডিং নির্ধারণ করতে পারে এবং এটি সঠিকভাবে ব্যবহার করতে পারে। কোনও ফাইল বা পাইপতে পাইথন লেখার সময় 'ascii' এনকোডিংয়ে ডিফল্ট থাকে যদি না অন্যথায় স্পষ্টভাবে বলা হয়। PYTHONIOENCODINGপরিবেশ পরিবর্তনশীল মাধ্যমে আউটপুট পাইপ করার সময় পাইথনকে কী করা উচিত তা বলা যেতে পারে । পাইথন আউটপুট কোনও ফাইল বা পাইপে পুনঃনির্দেশ করার আগে একটি শেল এই পরিবর্তনশীলটি সেট করতে পারে যাতে সঠিক এনকোডিংটি জানা যায়।

আপনার ক্ষেত্রে আপনি 4 টি অস্বাভাবিক অক্ষর মুদ্রণ করেছেন যা আপনার টার্মিনালটি এর ফন্টে সমর্থন করে না। আমার টার্মিনাল দ্বারা সমর্থিত অক্ষরগুলির সাথে (যা ইউটিএফ -8 নয় সিপি 437 ব্যবহার করে) সহ আচরণটি ব্যাখ্যা করতে সহায়তা করার জন্য এখানে কয়েকটি উদাহরণ রয়েছে।

উদাহরণ 1

নোট করুন যে #codingমন্তব্যটি সেই এনকোডিংকে নির্দেশ করে যেখানে উত্স ফাইলটি সংরক্ষিত হয়েছে। আমি utf8 পছন্দ করেছি যাতে আমি উত্সতে অক্ষরগুলি সমর্থন করতে পারি যা আমার টার্মিনালটি পারে না। স্টোরারে পুনর্নির্দেশকৃত এনকোডিং যাতে কোনও ফাইলে পুনর্নির্দেশ করা যায় তখন এটি দেখা যায়।

#coding: utf8
import sys
uni = u'αßΓπΣσµτΦΘΩδ∞φ'
print >>sys.stderr,sys.stdout.encoding
print uni

আউটপুট (টার্মিনাল থেকে সরাসরি চালানো)

cp437
αßΓπΣσµτΦΘΩδ∞φ

পাইথন সঠিকভাবে টার্মিনালের এনকোডিং নির্ধারণ করেছে।

আউটপুট (ফাইলটিতে পুনঃনির্দেশিত)

None
Traceback (most recent call last):
  File "C:\ex.py", line 5, in <module>
    print uni
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-13: ordinal not in range(128)

পাইথন এনকোডিং নির্ধারণ করতে পারেনি (কিছুই নয়) সুতরাং ব্যবহৃত 'ascii' ডিফল্ট। এএসসিআইআই কেবল ইউনিকোডের প্রথম 128 টি অক্ষরের রূপান্তরকে সমর্থন করে।

আউটপুট (ফাইলে পুনঃনির্দেশিত, পাইথনিওনকডিং = সিপি 437)

cp437

এবং আমার আউটপুট ফাইলটি সঠিক ছিল:

C:\>type out.txt
αßΓπΣσµτΦΘΩδ∞φ

উদাহরণ 2

এখন আমি উত্সটিতে এমন একটি চরিত্র ফেলব যা আমার টার্মিনাল দ্বারা সমর্থিত নয়:

#coding: utf8
import sys
uni = u'αßΓπΣσµτΦΘΩδ∞φ马' # added Chinese character at end.
print >>sys.stderr,sys.stdout.encoding
print uni

আউটপুট (টার্মিনাল থেকে সরাসরি চালানো)

cp437
Traceback (most recent call last):
  File "C:\ex.py", line 5, in <module>
    print uni
  File "C:\Python26\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u9a6c' in position 14: character maps to <undefined>

আমার টার্মিনালটি সেই শেষ চীনা চরিত্রটি বুঝতে পারে নি।

আউটপুট (সরাসরি চালানো, পাইথনিওনকডিং = 437: প্রতিস্থাপন)

cp437
αßΓπΣσµτΦΘΩδ∞φ?

ত্রুটি হ্যান্ডলারগুলি এনকোডিংয়ের মাধ্যমে নির্দিষ্ট করা যেতে পারে। এক্ষেত্রে অজানা চরিত্রগুলি প্রতিস্থাপন করা হয়েছিল ?ignoreএবং xmlcharrefreplaceকিছু অন্যান্য বিকল্প। ইউটিএফ 8 ব্যবহার করার সময় (যা ইউনিকোডের সমস্ত অক্ষরকে এনকোডিং সমর্থন করে) প্রতিস্থাপন কখনই করা হবে না, তবে অক্ষরগুলি প্রদর্শনের জন্য ব্যবহৃত ফন্টটি অবশ্যই তাদের সমর্থন করবে।


এটি ঠিক সত্য নয় যে "ফাইল বা পাইপ লেখার সময় পাইথন ডিফল্ট 'অ্যাস্কি' এনকোডিংয়ে অন্যথায় স্পষ্টভাবে না বললে"। আসলে, পাইথন 3 ম্যাক ওএস এক্স / ফিংকে ইউটিএফ -8 ব্যবহার করে।
এরিক হে লেবিগোট

2
হ্যাঁ, পাইথন 3 'utf8' তে ডিফল্ট, তবে ওপি'র নমুনার উপর ভিত্তি করে তিনি পাইথন ২. এক্স ব্যবহার করছেন, যা ডিফল্টকে 'এসসিআই' বলে।
মার্ক টোলোনেন

কারসাজি করে আমি সঠিক আউটপুট পেতে পারি না PYTHONIOENCODING। এরকম print string.encode("UTF-8")হিসাবে প্রস্তাব @Ismail আমার জন্য কাজ করে।
ট্রিপলি

আপনার ফন্টগুলি chcpকোডেপেজ সমর্থন না করে এমনকি যদি তাদের সমর্থন করে তবে আপনি চাইনিজ অক্ষর দেখতে পাবেন । এড়াতে UnicodeEncodeError: 'charmap', আপনি win-unicode-consoleপ্যাকেজ ইনস্টল করতে পারেন ।
jfs

আমার সমস্যাটি হ'ল পাইথন-গিটল্যাব সিএলআই চীনা অক্ষরগুলি সিএমডি ভালভাবে প্রিন্ট করে তবে ফাইলগুলিতে পুনঃনির্দেশিত হওয়ার পরে অক্ষরগুলি আবর্জনা। PYTHONIOENCODING=utf-8সমস্যা সমাধান করে
এলপিকি

12

মুদ্রণের সময় এটিকে এনকোড করুন

uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni.encode("utf-8")

এর কারণ এটি যখন আপনি স্ক্রিপ্টটি ম্যানুয়ালি চালান অজগরটি টার্মিনালে আউটপুট দেওয়ার আগে এটি এনকোড করে, আপনি যখন পাইপ করেন তখন পাইথন এটি নিজেই এনকোড করে না তাই I / O করার সময় আপনাকে ম্যানুয়ালি এনকোড করতে হবে।


4
এটি ডাব্লুএইচটি এখানে যে প্রশ্নটি চলছে সেটির এখনও উত্তর দেয় না। কেন, নীলার বাইরে এটি পুনর্নির্দেশের সময়ই এনকোড করার সিদ্ধান্ত নেয়, যখন এটি প্রক্রিয়াটিতে সম্পূর্ণ স্বচ্ছ বলে মনে করা হয়।
ম্যাক্সিম স্লোইকো

পুনঃনির্দেশ সম্পাদন করার সময় পাইথন কেন এটি এনকোড করে না? অজগর কী স্পষ্টভাবে পরীক্ষা করে সিদ্ধান্ত নিয়েছে যে এটি কিছু কঠিন হয়ে ওঠার জন্য আলাদাভাবে কাজ করবে?
আরাফ্যাজিওন

1
অজগর এমনকি দুটি পরিস্থিতিতে পার্থক্য করার উপায় আছে? আমি (এখন অবধি ...) জানি এটির উপায় নেই।
zedoo

4
পাইথন আউটপুটটি টার্মিনাল কিনা তা পরীক্ষা করতে পারে, যদি পাইপের সাথে এটির আউটপুট হয় তবে টার্মিনালের ধরণটি "বোবা" হবে। আমার ধারণা "বোবা" আপনাকে বলা উচিত কেন পাইথন এই ক্ষেত্রে স্বয়ংক্রিয় কিছু করার চেষ্টা করে না, এটি ব্যর্থ হতে পারে।
ইসমাইল

1
পরিবেশটি এমন একটি চরিত্রের এনকোডিং ব্যবহার করে যা utf-8 (যেমন উইন্ডোজে প্রচলিত) এর সাথে সামঞ্জস্যপূর্ণ নয় এমন এটি মুজিবাকে উত্পাদন করে। আপনার স্ক্রিপ্টের মধ্যে আপনার পরিবেশের অক্ষর এনকোডিং হার্ডকোড করবেন না। আপনার লোকেল, বা পাইথনিওনকডিং কনফিগার করুন, বা win-unicode-console(উইন্ডোজ) ইনস্টল করুন , বা একটি কমান্ড-লাইন প্যারামিটার গ্রহণ করুন (যদি আপনার প্রয়োজন হয়)।
jfs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.