python - পাইথন ভাষায় ডিকশনারি কেন ব্যবহার করা হয়




পাইথন, ইউনিকোড, এবং উইন্ডোজ কনসোল (9)

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

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

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

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

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

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

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

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


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

import sys
sys.getdefaultencoding()

যদি এটি অ্যাসিসি বলে, তবে আপনার কারণ আছে ;-) আপনাকে সাইটকাস্টাইজিটিপি নামে একটি ফাইল তৈরি করতে হবে এবং এটি পাইথন পাথের অধীনে রাখুন (আমি এটি /usr/lib/python2.5/site-packages এর অধীনে রাখি, তবে এটি ডি differen Win - এটি c: \ python \ lib \ সাইট-প্যাকেজ বা কিছু), নিম্নলিখিত সামগ্রী সহ:

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

এবং সম্ভবত আপনি আপনার ফাইলগুলিতে এনকোডিং উল্লেখ করতে চাইতে পারেন:

# -*- coding: UTF-8 -*-
import sys,time

সম্পাদনা করুন: পাইথন বইটিতে ডাইভ চমৎকার তথ্য পাওয়া যায়


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

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


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

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

>set PYTHONIOENCODING=UTF-8

টি এল; ডিআর:

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

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

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

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

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

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

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


নীচের কোডটি পিওথন আউটপুটকে উইন্ডোজ-এ এমনকি 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"

পাইথন 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 লুসিদা কনসোল নির্বাচন করুন।


পাইথন স্ক্রিপ্টটি কার্যকর করার আগে এই কোডটি কমান্ড লাইনে প্রবেশ করান:

chcp 65001 & set PYTHONIOENCODING=utf-8

দ্রষ্টব্য: এই উত্তরটি পুরানো (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
  Б
  Б

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





unicode