python যবহ পাইথন, ইউনিকোড, এবং উইন্ডোজ কনসোল




পাইথন ভাষায় ডিকশনারি কেন ব্যবহার করা হয় (11)

যখন আমি একটি উইন্ডোজ কনসোলে একটি ইউনিকোড স্ট্রিং মুদ্রণ করার চেষ্টা করি, তখন আমি একটি ইউনিকোড UnicodeEncodeError: 'charmap' codec can't encode character .... ত্রুটি পেতে UnicodeEncodeError: 'charmap' codec can't encode character .... ত্রুটি। আমি মনে করি এই কারণ উইন্ডোজ কনসোল ইউনিকোড শুধুমাত্র অক্ষর গ্রহণ করে না। এই চারপাশে সবচেয়ে ভাল উপায় কি? পাইথন স্বয়ংক্রিয়ভাবে একটি মুদ্রণ করতে পারেন কোন উপায় আছে কি ? পরিবর্তে এই পরিস্থিতিতে ব্যর্থ?

সম্পাদনা: আমি পাইথন 2.5 ব্যবহার করছি।

দ্রষ্টব্য: @ ল্যাসেভি কার্লসেন চেকমার্ক দিয়ে উত্তরটি পুরনো (2008 থেকে) পুরনো। যত্ন সহ নীচের সমাধান / উত্তর / পরামর্শ ব্যবহার করুন দয়া করে !!

@ জেএফএসবেস্টিয়ান উত্তর আজকের মতো আরও প্রাসঙ্গিক (6 জানুয়ারী 2016)।


জেমস সুলাক জিজ্ঞাসা করলেন,

পাইথন স্বয়ংক্রিয়ভাবে একটি মুদ্রণ করতে পারেন কোন উপায় আছে কি? পরিবর্তে এই পরিস্থিতিতে ব্যর্থ?

অন্যান্য সমাধানগুলি সুপারিশ করে আমরা উইন্ডোজ পরিবেশ পরিবর্তন করতে বা পাইথন এর print() ফাংশন প্রতিস্থাপন করার চেষ্টা করি। নীচের উত্তর Sulak এর অনুরোধ পূরণের কাছাকাছি আসে।

উইন্ডোজ 7 এর অধীনে, পাইথন 3.5 ইউনিকোড প্রিন্ট করার জন্য ইউনিকোড এ UnicodeEncodeError নিক্ষেপ না করে নিম্নরূপঃ

এর জায়গায়: print(text)
বিকল্প: print(str(text).encode('utf-8'))

একটি ব্যতিক্রম নিক্ষেপ করার পরিবর্তে, পাইথন এখন অস্পষ্ট ইউনিকোড অক্ষরগুলিকে \ xNN হেক্স কোড হিসাবে দেখায়, উদাহরণস্বরূপ:

হালমালো এন \ xe2 \ x80 \ x99 \ xc3 \ xa9tait প্লাস qu x x2 \ x80 \ x99un পয়েন্ট নীরব

পরিবর্তে

হ্যালামালো এন'টিয়েট প্লাস কোয়ান পয়েন্ট নূর

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

দ্রষ্টব্য: উপরের str() কলটি প্রয়োজন কারণ অন্যথায় encode() কারণে পাইথন একটি ইউনিকোড চরিত্রকে সংখ্যাগুলির একটি টুপি হিসাবে প্রত্যাখ্যান করে।


আপডেট: পাইথন 3.6 পিইপি 528 প্রয়োগ করে : উইন্ডোজ কনসোল এনকোডিংটি ইউটিএফ -8 তে পরিবর্তন করুন: উইন্ডোজের ডিফল্ট কনসোল এখন সব ইউনিকোড অক্ষর গ্রহণ করবে। অভ্যন্তরীণভাবে, এটি নীচের উল্লিখিত win-unicode-console প্যাকেজ হিসাবে একই ইউনিকোড API ব্যবহার করে। print(unicode_string) শুধু এখন কাজ করা উচিত।

আমি একটি UnicodeEncodeError: 'charmap' codec can't encode character... পেতে UnicodeEncodeError: 'charmap' codec can't encode character... ত্রুটি।

ত্রুটির মানে হল যে আপনি যে ইউনিকোড অক্ষর মুদ্রণ করার চেষ্টা করছেন তা বর্তমান ( chcp ) কনসোল ক্যারেক্টার এনকোডিং ব্যবহার করে উপস্থাপন করা যাবে না। cp437 প্রায়ই 8-বিট এনকোডিং যেমন cp437 যা ~ 1x ইউনিকোড অক্ষরের ~ 0x100 অক্ষরগুলি প্রতিনিধিত্ব করতে পারে:

>>> u"\N{EURO SIGN}".encode('cp437')
Traceback (most recent call last):
...
UnicodeEncodeError: 'charmap' codec can't encode character '\u20ac' in position 0:
character maps to 

আমি মনে করি এই কারণ উইন্ডোজ কনসোল ইউনিকোড শুধুমাত্র অক্ষর গ্রহণ করে না। এই চারপাশে সবচেয়ে ভাল উপায় কি?

উইন্ডোজ কনসোল ইউনিকোড অক্ষর গ্রহণ করে এবং এটিও তাদের প্রদর্শন করতে পারে (শুধুমাত্র বিএমপি) যদি সংশ্লিষ্ট ফন্ট কনফিগার করা থাকেWriteConsoleW() API টি @ ডায়ারা হপউডের উত্তরে প্রস্তাবিত হিসাবে ব্যবহার করা উচিত। এটি স্বচ্ছভাবে বলা যেতে পারে, যদি আপনি win-unicode-console প্যাকেজটি ব্যবহার করেন তবে আপনার স্ক্রিপ্টগুলি পরিবর্তন করার দরকার নেই এবং এতে পরিবর্তন করা উচিত নয়:

T:\> py -mpip install win-unicode-console
T:\> py -mrun your_script.py

দেখুন পাইথন 3.4, ইউনিকোড, বিভিন্ন ভাষা এবং উইন্ডোজ এর সাথে কী চুক্তি?

পাইথন স্বয়ংক্রিয়ভাবে একটি মুদ্রণ করতে পারেন কোন উপায় আছে কি ? পরিবর্তে এই পরিস্থিতিতে ব্যর্থ?

যদি এটি সমস্ত অক্ষরহীন অক্ষর প্রতিস্থাপন করা যথেষ্ট হয় ? আপনার ক্ষেত্রে তারপর আপনি PYTHONIOENCODING envvar সেট করতে পারে:

T:\> set PYTHONIOENCODING=:replace
T:\> python3 -c "print(u'[\N{EURO SIGN}]')"
[?]

পাইথন 3.6+ এ, PYTHONIOENCODING এনভভার দ্বারা নির্দিষ্ট এনকোডিংটি ইন্টারেক্টিভ কনসোল বাফারের জন্য উপেক্ষা করা হয় না PYTHONLEGACYWINDOWSIOENCODING না PYTHONLEGACYWINDOWSIOENCODING envvar একটি অ-খালি স্ট্রিংয়ের জন্য সেট করা হয়।


Giampaolo Rodolà এর উত্তরের মত, এমনকি আরও নোংরা: আমি সত্যি সত্যিই এনকোডিংগুলির সমগ্র বিষয় এবং উইন্ডোজ কনসোলগুলিতে কীভাবে প্রয়োগ করি তা বোঝার জন্য অনেক সময় ব্যয় করতে চাইছি,

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

def pr(s):
    try:
        print(s)
    except UnicodeEncodeError:
        for c in s:
            try:
                print( c, end='')
            except UnicodeEncodeError:
                print( '?', end='')

NB "pr" ছোট "প্রিন্ট" (এবং "নিরাপদ মুদ্রণ" এর চেয়ে টাইপের চেয়ে ছোট) এর চেয়ে ছোট। ...!


দ্রষ্টব্য: এই উত্তরটি পুরানো (2008 থেকে) পুরানো। যত্ন সঙ্গে নীচের সমাধান ব্যবহার করুন দয়া করে !!

এখানে এমন একটি পৃষ্ঠা রয়েছে যা সমস্যা এবং সমাধানটি বিশদ করে ( একটি উদাহরণে পাঠ্য মোড়ানো sys.stdout এর জন্য পৃষ্ঠাটি অনুসন্ধান করুন):

প্রিন্টফেলস - পাইথন উইকি

এখানে যে পৃষ্ঠা থেকে একটি কোড উদ্ধৃতাংশ আছে:

$ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line'
  UTF-8
  <type 'unicode'> 2
  Б
  Б

  $ python -c 'import sys, codecs, locale; print sys.stdout.encoding; \
    sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout); \
    line = u"\u0411\n"; print type(line), len(line); \
    sys.stdout.write(line); print line' | cat
  None
  <type 'unicode'> 2
  Б
  Б

সেই পৃষ্ঠায় আরও কিছু তথ্য রয়েছে, যা পড়ার যোগ্য।


পাইথন 2 এর জন্য চেষ্টা করুন:

print unicode(string, 'unicode-escape')

পাইথন 3 এর জন্য চেষ্টা করুন:

import os
string = "002 Could've Would've Should've"
os.system('echo ' + string)

অথবা জয়-ইউনিকোড-কনসোল চেষ্টা করুন:

pip install win-unicode-console
py -mrun your_script.py

কোডটি পৃষ্ঠা 65001 এ পরিবর্তন করার পরামর্শ দেয় এমন অন্যান্য সম্ভাব্য-সাবলীল উত্তর সত্ত্বেও, এটি bugs.python.org/issue1602 । (এছাড়াও, sys.setdefaultencoding ব্যবহার করে ডিফল্ট এনকোডিং পরিবর্তন করা একটি ভাল ধারণা নয় ।)

বিস্তারিত কাজ এবং কোড যে কাজ করে এই প্রশ্ন দেখুন।


জেএফ সেবাস্তিয়ানের উত্তর সম্পর্কিত সম্পর্কিত, কিন্তু আরো সরাসরি।

কনসোল / টার্মিনালে মুদ্রণের সময় আপনি যদি এই সমস্যাটি পান তবে এইটি করুন:

>set PYTHONIOENCODING=UTF-8

নীচের কোডটি পিওথন আউটপুটকে উইন্ডোজ-এ এমনকি UTF-8 হিসাবে কনসোল করতে সহায়তা করবে।

কনসোল উইন্ডোজ 7 এ ভাল অক্ষর প্রদর্শন করবে তবে উইন্ডোজ এক্সপি এ এটি ভালভাবে প্রদর্শন করবে না, তবে অন্তত এটি কাজ করবে এবং সর্বাধিক গুরুত্বপূর্ণ সমস্ত প্ল্যাটফর্মগুলিতে আপনার স্ক্রিপ্ট থেকে একটি ধারাবাহিক আউটপুট থাকবে। আপনি একটি ফাইল আউটপুট পুনঃনির্দেশিত করতে সক্ষম হবেন।

নীচের কোডটি উইন্ডোজটিতে পাইথন 2.6 দিয়ে পরীক্ষা করা হয়েছিল।


#!/usr/bin/python
# -*- coding: UTF-8 -*-

import codecs, sys

reload(sys)
sys.setdefaultencoding('utf-8')

print sys.getdefaultencoding()

if sys.platform == 'win32':
    try:
        import win32console 
    except:
        print "Python Win32 Extensions module is required.\n You can download it from https://sourceforge.net/projects/pywin32/ (x86 and x64 builds are available)\n"
        exit(-1)
    # win32console implementation  of SetConsoleCP does not return a value
    # CP_UTF8 = 65001
    win32console.SetConsoleCP(65001)
    if (win32console.GetConsoleCP() != 65001):
        raise Exception ("Cannot set console codepage to 65001 (UTF-8)")
    win32console.SetConsoleOutputCP(65001)
    if (win32console.GetConsoleOutputCP() != 65001):
        raise Exception ("Cannot set console output codepage to 65001 (UTF-8)")

#import sys, codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
sys.stderr = codecs.getwriter('utf8')(sys.stderr)

print "This is an Е乂αmp١ȅ testing Unicode support using Arabic, Latin, Cyrillic, Greek, Hebrew and CJK code points.\n"

টি এল; ডিআর:

print(yourstring.encode('ascii','replace'));

আমি একটি টুইচ চ্যাট (আইআরসি) বোতল কাজ, এই নিজেকে মধ্যে দৌড়ে। (পাইথন 2.7 সর্বশেষ)

আমি প্রতিক্রিয়া জানানোর জন্য চ্যাট বার্তা পার্স করতে চেয়েছিলেন ...

msg = s.recv(1024).decode("utf-8")

কিন্তু মানব-পঠনযোগ্য বিন্যাসে কনসোলে নিরাপদে তাদের মুদ্রণ করুন:

print(msg.encode('ascii','replace'));

এটি ইউনিকোড এ UnicodeEncodeError: 'charmap' ত্রুটিগুলি নিক্ষেপ করে এবং ইউনিকোড অক্ষরগুলি প্রতিস্থাপিত করে UnicodeEncodeError: 'charmap' সমস্যাটি সংশোধন করেছে ?


আপনি যদি খারাপ চরিত্রের একটি নির্ভরযোগ্য উপস্থাপনা পেতে আগ্রহী না হন তবে আপনি এটির মতো কিছু ব্যবহার করতে পারেন (পাইথন> = 2.6, সহ 3.x সহ):

from __future__ import print_function
import sys

def safeprint(s):
    try:
        print(s)
    except UnicodeEncodeError:
        if sys.version_info >= (3,):
            print(s.encode('utf8').decode(sys.stdout.encoding))
        else:
            print(s.encode('utf8'))

safeprint(u"\N{EM DASH}")

স্ট্রিংয়ের খারাপ চরিত্রগুলি একটি উপস্থাপনা রূপে রূপান্তরিত হবে যা উইন্ডোজ কনসোল দ্বারা মুদ্রণযোগ্য।


পাইথন 3.6 উইন্ডোজ 7: পাইথন চালু করার বিভিন্ন উপায় রয়েছে যা আপনি পাইথন কনসোল ব্যবহার করতে পারেন (এটিতে একটি পাইথন লোগো রয়েছে) অথবা উইন্ডোজ কনসোল (এটিতে cmd.exe লেখা আছে)।

আমি উইন্ডো কনসোলে utf8 অক্ষর মুদ্রণ করতে পারিনি। মুদ্রণ utf-8 অক্ষর আমাকে এই ত্রুটি নিক্ষেপ:

OSError: [winError 87] The paraneter is incorrect 
Exception ignored in: (_io-TextIOwrapper name='(stdout)' mode='w' ' encoding='utf8') 
OSError: [WinError 87] The parameter is incorrect 

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





unicode