ইউনিকোড (ইউটিএফ -8) পাইথনের ফাইলগুলিতে পড়া এবং লেখা


328

কোনও ফাইলের পাঠ্য পড়া এবং লেখার ক্ষেত্রে আমার কিছুটা মস্তিষ্কের ব্যর্থতা রয়েছে (পাইথন ২.৪)।

# The string, which has an a-acute in it.
ss = u'Capit\xe1n'
ss8 = ss.encode('utf8')
repr(ss), repr(ss8)

("u'Capit \ xe1n" "," 'ক্যাপিট \ xc3 \ xa1n' ")

print ss, ss8
print >> open('f1','w'), ss8

>>> file('f1').read()
'Capit\xc3\xa1n\n'

সুতরাং আমি Capit\xc3\xa1nআমার প্রিয় সম্পাদক টাইপ , ফাইল এফ 2।

তারপর:

>>> open('f1').read()
'Capit\xc3\xa1n\n'
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
>>> open('f1').read().decode('utf8')
u'Capit\xe1n\n'
>>> open('f2').read().decode('utf8')
u'Capit\\xc3\\xa1n\n'

আমি এখানে কি বুঝতে পারি না? স্পষ্টতই কিছু গুরুত্বপূর্ণ জাদু আছে (বা ভাল জ্ঞান) যা আমি অনুপস্থিত। সঠিক রূপান্তর পেতে টেক্সট ফাইলগুলিতে এক ধরণের কী রয়েছে?

আমি এখানে আঁকড়ে ধরতে সত্যিই ব্যর্থ হচ্ছি, ইউটিএফ -8 উপস্থাপনার মূল বিষয়টি হ'ল যদি আপনি আসলে পাইথনটিকে এটি সনাক্ত করতে না পারেন, যখন বাইরে থেকে আসে। হয়তো আমার কেবল জেএসএনকে স্ট্রিংটি ফেলে দেওয়া উচিত, এবং পরিবর্তে এটি ব্যবহার করা উচিত, যেহেতু এটির একটি দৃci় প্রতিনিধিত্ব রয়েছে! আরও লক্ষণীয় বিষয়, কোনও ফাইল থেকে আসার সময় পাইথন সনাক্ত করতে এবং ডিকোড করবে এই ইউনিকোড অবজেক্টের কোনও ASCII উপস্থাপনা? যদি তা হয় তবে আমি কীভাবে এটি পাব?

>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'

উত্তর:


110

স্বরলিপি

u'Capit\xe1n\n'

"\ xe1" কেবলমাত্র একটি বাইট উপস্থাপন করে। "\ x" আপনাকে বলে যে "ই 1" হেক্সাডেসিমালে রয়েছে। আপনি যখন লিখুন

Capit\xc3\xa1n

আপনার ফাইলে এটিতে "\ xc3" রয়েছে। সেগুলি 4 বাইট এবং আপনার কোডে আপনি সেগুলি সমস্ত পড়েন। আপনি এগুলি প্রদর্শিত হলে আপনি এটি দেখতে পাবেন:

>>> open('f2').read()
'Capit\\xc3\\xa1n\n'

আপনি দেখতে পারেন যে ব্যাকস্ল্যাশ একটি ব্যাকস্ল্যাশ দ্বারা পালিয়ে গেছে। সুতরাং আপনার স্ট্রিংয়ে আপনার চারটি বাইট রয়েছে: "\", "x", "সি" এবং "3"।

সম্পাদনা:

যেমন অন্যরা তাদের উত্তরে নির্দেশ করেছে, আপনার কেবল সম্পাদকের অক্ষরগুলি প্রবেশ করা উচিত এবং আপনার সম্পাদককে ইউটিএফ -8 এ রূপান্তরটি পরিচালনা করতে হবে এবং সংরক্ষণ করতে হবে।

যদি আপনার কাছে এই ফর্ম্যাটটিতে স্ট্রিং থাকে তবে আপনি string_escapeএটিকে একটি সাধারণ স্ট্রিংয়ে ডিকোড করতে কোডেক ব্যবহার করতে পারেন :

In [15]: print 'Capit\\xc3\\xa1n\n'.decode('string_escape')
Capitán

ফলাফলটি এমন একটি স্ট্রিং যা ইউটিএফ -8 এ এনকোড থাকে যেখানে উচ্চারণকৃত অক্ষরটি \\xc3\\xa1মূল স্ট্রিংয়ে লেখা দুটি বাইট দ্বারা উপস্থাপিত হয় । আপনি যদি একটি ইউনিকোড স্ট্রিং রাখতে চান তবে আপনাকে আবার ইউটিএফ -8 দিয়ে ডিকোড করতে হবে।

আপনার সম্পাদনায়: আপনার ফাইলটিতে ইউটিএফ -8 নেই। এটি দেখতে কেমন হবে তা দেখার জন্য:

s = u'Capit\xe1n\n'
sutf8 = s.encode('UTF-8')
open('utf-8.out', 'w').write(sutf8)

আপনি utf-8.outআপনার সম্পাদকের সাথে যে ফাইলটি সংরক্ষণ করেছেন সেটির সামগ্রীর সাথে ফাইলের সামগ্রীটির তুলনা করুন ।


সুতরাং, পাইথন এটি ব্যবহার করে ফাইলগুলিতে পড়তে পারলে utf-8 এনকোডযুক্ত বিন্যাসটির বিন্দুটি কী? অন্য কথায়, পাইথনটি by xc3 এ 1 বাইট হিসাবে পড়বে এমন কোনও আসকি উপস্থাপনা আছে কি?
গ্রেগ লিন্ড

4
আপনার "সুতরাং, কী বিষয়…" প্রশ্নের উত্তর হ'ল "মিউ"। (যেহেতু পাইথন ইউটিএফ -8 এ এনকোড করা ফাইলগুলি পড়তে পারে)। আপনার দ্বিতীয় প্রশ্নের জন্য: c xc3 ASCII সেটটির অংশ নয়। এর পরিবর্তে সম্ভবত আপনি "8-বিট এনকোডিং" বলতে চাইছেন। আপনি ইউনিকোড এবং এনকোডিং সম্পর্কে বিভ্রান্ত; এটা ঠিক আছে, অনেক আছে।
tzot

8
এটি প্রাইমার হিসাবে পড়ার চেষ্টা করুন: joelonsoftware.com/articles/Unicode.html
tzot

দ্রষ্টব্য: u'\xe1'একটি ইউনিকোড কোডপয়েন্ট U+00e1that যা চরিত্রের এনকোডিংয়ের উপর নির্ভর করে 1 বা একাধিক বাইট ব্যবহার করে প্রতিনিধিত্ব করা যেতে পারে (এটি utf-8 এ 2 বাইট)। b'\xe1'এক বাইট (ক সংখ্যা 225), যদি থাকে কি চিঠি এটা উপস্থাপন করতে পারেন চরিত্র উপর নির্ভর করে এটা ডিকোড করতে যেমন যে এনকোডিং ব্যবহার করা হয়, এটি হয় б( U+0431) cp1251 এ, с( U+0441) cp866, ইত্যাদি
JFS

11
অবাক করা কতজন ব্রিটিশ কোডার "শুধু এসকিই ব্যবহার করুন" এবং তারপরে বুঝতে পারছেন না যে £ চিহ্নটি এটি নয়। বেশিরভাগই সচেতন নয় যে আসকি! = স্থানীয় কোড পৃষ্ঠা (যেমন লাতিন 1)।
ড্যানি স্ট্যাপল

710

এনকোড এবং ডিকোড পদ্ধতিগুলির সাথে জড়িত হওয়ার চেয়ে ফাইলটি খোলার সময় এনকোডিংটি নির্দিষ্ট করা সহজ বলে মনে করি। ioমডিউল (পাইথন 2.6 যোগ) একজন উপলব্ধ io.openফাংশন, যা একটি এনকোডিং প্যারামিটার রয়েছে।

ioমডিউলটি থেকে মুক্ত পদ্ধতিটি ব্যবহার করুন ।

>>>import io
>>>f = io.open("test", mode="r", encoding="utf-8")

তারপরে এফের রিড () ফাংশনটি কল করার পরে একটি এনকোডযুক্ত ইউনিকোড বস্তু ফিরে আসে।

>>>f.read()
u'Capit\xe1l\n\n'

দ্রষ্টব্য যে পাইথন 3 এ, io.openফাংশনটি বিল্ট-ইন openফাংশনের জন্য একটি উপনাম । বিল্ট-ইন ওপেন ফাংশনটি পাইথন 2-তে নয়, পাইথন 3-এ কেবল এনকোডিং যুক্তি সমর্থন করে supports

সম্পাদনা: পূর্বে এই উত্তরটি কোডেক মডিউলটির সুপারিশ করেছিল । কোডেক মডিউল সমস্যা সৃষ্টি করতে পারে মিশ যখন read()এবংreadline() , তাই এই উত্তর এখন বিশেষ পরামর্শ দেওয়া হচ্ছে IO পরিবর্তে মডিউল।

কোডেস মডিউল থেকে উন্মুক্ত পদ্ধতিটি ব্যবহার করুন।

>>>import codecs
>>>f = codecs.open("test", "r", "utf-8")

তারপরে এফের রিড () ফাংশনটি কল করার পরে একটি এনকোডযুক্ত ইউনিকোড বস্তু ফিরে আসে।

>>>f.read()
u'Capit\xe1l\n\n'

আপনি যদি কোনও ফাইলের এনকোডিং জানেন তবে কোডেস প্যাকেজটি ব্যবহার করা অনেক কম বিভ্রান্তিকর হতে চলেছে।

Http://docs.python.org/library/codecs.html#codecs.open দেখুন


74
পরিবর্তে ফাইল খুব লেখার জন্য পুরোপুরি কাজ করে, open(file,'w')না codecs.open(file,'w','utf-8')মীমাংসিত
ম্যাট Connolly

1
এই উত্তরটি আমি খুঁজছিলাম :)
জাস্টিন

6
codecs.open(...)পদ্ধতিটি কি সম্পূর্ণরূপে with open(...):শৈলীর সাথে সামঞ্জস্য হয় , যেখানে withসমস্ত কাজ শেষ হওয়ার পরে ফাইলটি বন্ধ করার বিষয়ে যত্নশীল? এটি যেভাবেই চলবে বলে মনে হচ্ছে।
চেষ্টা করুন-শেষ পর্যন্ত

2
@ চেষ্টা করুন-অবশেষে হ্যাঁ। আমি with codecs.open(...) as f:সব সময় ব্যবহার ।
টিম সোয়াস্ট

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

45

পাইথন 3 এ এখন আপনার যা দরকার তা হ'ল open(Filename, 'r', encoding='utf-8')

[অনুরোধ করা স্পষ্টির জন্য 2016-02-10 এ সম্পাদনা করুন]

পাইথন 3 এর খোলা ফাংশনে এনকোডিং প্যারামিটার যুক্ত করেছে । ওপেন ফাংশন সম্পর্কে নিম্নলিখিত তথ্যগুলি এখান থেকে সংগ্রহ করা হয়েছে: https://docs.python.org/3/library/function.html#open

open(file, mode='r', buffering=-1, 
      encoding=None, errors=None, newline=None, 
      closefd=True, opener=None)

এনকোডিং হ'ল এনকোডিংয়ের নাম ফাইলটি ডিকোড করতে বা এনকোড করতে ব্যবহৃত হয়। এটি কেবল পাঠ্য মোডে ব্যবহার করা উচিত। ডিফল্ট এনকোডিংটি প্ল্যাটফর্ম নির্ভর (যা কিছু লোকাল.জেটফেরেফেরডেনকোডিং () রিটার্ন করে) তবে পাইথনের সমর্থিত কোনও পাঠ্য এনকোডিং ব্যবহার করা যেতে পারে। সমর্থিত এনকোডিংগুলির তালিকার জন্য কোডেক মডিউলটি দেখুন ।

সুতরাং encoding='utf-8'ওপেন ফাংশনে একটি প্যারামিটার হিসাবে যুক্ত করে ফাইল পড়া এবং লেখা সবই utf8 হিসাবে সম্পন্ন হয় (এটি এখন পাইথনের যে কোনও কিছুর ডিফল্ট এনকোডিং ing


আপনি যে উত্তরটি সরবরাহ করেন সে সম্পর্কে আরও কিছু বিবরণ যুক্ত করে আরও উত্তর দিতে পারেন?
অ্যারিসোন

2
দেখে মনে হচ্ছে এটি কোডেক মডিউলটি ব্যবহার করে অজগর 2 তে পাওয়া যায় - codecs.open('somefile', encoding='utf-8') stackoverflow.com/a/147756/149428
টেলর এডমিস্টন

18

সুতরাং, আমি যা খুঁজছি তার জন্য আমি একটি সমাধান খুঁজে পেয়েছি, যা:

print open('f2').read().decode('string-escape').decode("utf-8")

এমন কিছু অস্বাভাবিক কোডেক রয়েছে যা এখানে দরকারী। এই বিশেষ পাঠটি পাইথনের মধ্যে থেকে ইউটিএফ -8 উপস্থাপনা নিতে, এএসসিআইআই ফাইলে অনুলিপি করতে এবং সেগুলি ইউনিকোডে পড়তে দেয় allows "স্ট্রিং-পলায়ন" ডিকোডের অধীনে, স্ল্যাশগুলি দ্বিগুণ করা হবে না।

এটি আমি যে কল্পনা করেছিলাম তার জন্য বাছাইয়ের জন্য অনুমতি দেয়।


1
ভাল প্রতিক্রিয়া, আমি উভয় সমাধান পরীক্ষা করেছি (codecs.open(file,"r","utf-8")এবং সহজ open(file,"r").read().decode("utf-8")এবং উভয়ই নিখুঁতভাবে কাজ করেছি।
ঈগল

আমি একটি "TypeError: প্রত্যাশিত str, বাইট বা os.PathLike অবজেক্ট, _io.TextIOWrapper" কোন ধারণা কেন পাচ্ছি?
জিনস্নু

আমি মনে করি, upvotes এর সংখ্যা বিবেচনা করে, দ্বিতীয় উত্তরটি গ্রহণ করা একটি দুর্দান্ত ধারণা হবে :)
জ্যাকোকট

14
# -*- encoding: utf-8 -*-

# converting a unknown formatting file in utf-8

import codecs
import commands

file_location = "jumper.sub"
file_encoding = commands.getoutput('file -b --mime-encoding %s' % file_location)

file_stream = codecs.open(file_location, 'r', file_encoding)
file_output = codecs.open(file_location+"b", 'w', 'utf-8')

for l in file_stream:
    file_output.write(l)

file_stream.close()
file_output.close()

14

আসলে, এটি পাইথন ৩.২-এ ইউটিএফ -8 এনকোডিং সহ একটি ফাইল পড়ার জন্য আমার পক্ষে কাজ করেছে:

import codecs
f = codecs.open('file_name.txt', 'r', 'UTF-8')
for line in f:
    print(line)

6

একটি ইউনিকোড স্ট্রিং পড়তে এবং তারপরে এইচটিএমএল পাঠাতে, আমি এটি করেছি:

fileline.decode("utf-8").encode('ascii', 'xmlcharrefreplace')

পাইথন চালিত HTTP সার্ভারগুলির জন্য দরকারী Use


6

আপনি এনকোডিং সহ সাধারণ সমস্যা নিয়ে হোঁচট খেয়েছেন: ফাইলটি কোন এনকোডিংয়ে রয়েছে তা আমি কীভাবে বলতে পারি?

উত্তরঃ তুমি পারবে না যদি না ফাইল ফরম্যাট এই জন্য প্রদান করে। এক্সএমএল, উদাহরণস্বরূপ, এর মাধ্যমে শুরু হয়:

<?xml encoding="utf-8"?>

এই শিরোনামটি সাবধানতার সাথে বেছে নেওয়া হয়েছে যাতে এটি এনকোডিংয়ের কোনও বিষয়ই পড়তে পারা যায়। আপনার ক্ষেত্রে, এই জাতীয় কোনও ইঙ্গিত নেই, তাই আপনার সম্পাদক বা পাইথন উভয়েরই ধারণা নেই যে কি চলছে। অতএব, আপনাকে অবশ্যই codecsমডিউলটি ব্যবহার এবং ব্যবহার করতে হবেcodecs.open(path,mode,encoding) যা পাইথনে অনুপস্থিত বিট সরবরাহ করে।

আপনার সম্পাদক হিসাবে, আপনার অবশ্যই এটি পরীক্ষা করা উচিত যে এটি কোনও ফাইলের এনকোডিং সেট করার কোনও উপায় সরবরাহ করে।

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

পরের সংখ্যাটি পাইথনের উপস্থাপনা। এটি হাইকোজারল্যাচের মন্তব্যে পুরোপুরি ব্যাখ্যা করা হয়েছে । আপনার অবশ্যই বুঝতে হবে যে আপনার কনসোলটি কেবলমাত্র ASCII প্রদর্শন করতে পারে। ইউনিকোড বা যেকোন কিছুই> = চারকোড 128 প্রদর্শন করতে, অবশ্যই তাকে পালানোর কিছু উপায় ব্যবহার করতে হবে। আপনার সম্পাদকটিতে, আপনাকে অবশ্যই পালানো ডিসপ্লে স্ট্রিংটি টাইপ করতে হবে না তবে স্ট্রিংটির অর্থ কী (এই ক্ষেত্রে আপনাকে অবশ্যই উমলাউটে প্রবেশ করতে হবে এবং ফাইলটি সংরক্ষণ করতে হবে)।

এটি বলেছিল, আপনি পালানো স্ট্রিংটিকে স্ট্রিংয়ে পরিণত করতে পাইথন ফাংশন ইওল () ব্যবহার করতে পারেন:

>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1

আপনি দেখতে পাচ্ছেন, স্ট্রিং "\ xc3" একক অক্ষরে রূপান্তরিত হয়েছে। এটি এখন একটি 8-বিট স্ট্রিং, ইউটিএফ -8 এনকোডযুক্ত। ইউনিকোড পেতে:

>>> x.decode('utf-8')
u'Capit\xe1n\n'

গ্রেগ লিন্ড জিজ্ঞাসা করেছিলেন: আমি মনে করি এখানে কিছু টুকরো অনুপস্থিত রয়েছে: ফাইল এফ 2 এ রয়েছে: হেক্স:

0000000: 4361 7069 745c 7863 335c 7861 316e  Capit\xc3\xa1n

codecs.open('f2','rb', 'utf-8')উদাহরণস্বরূপ, এগুলি সমস্ত আলাদা আলাদা অক্ষরে পড়ে (প্রত্যাশিত) এএসসিআইআই-তে কোনও ফাইল লেখার কোনও উপায় আছে যা কাজ করবে?

উত্তর: এটি আপনার অর্থের উপর নির্ভর করে। এএসসিআইআই> 127 অক্ষরকে উপস্থাপন করতে পারে না So সুতরাং আপনাকে "পরবর্তী কয়েকটি অক্ষর বলতে কিছু বিশেষ বোঝায়" যা বলার জন্য কিছু উপায় দরকার যা "\ x" ক্রমটি করে। এটি বলে: পরের দুটি অক্ষর হ'ল একক চরিত্রের কোড। ইউনিকোডকে 0xFFFF (65535) পর্যন্ত এনকোড করতে চার অক্ষর ব্যবহার করে "\ u" একই কাজ করে।

সুতরাং আপনি ইউনিকোডকে সরাসরি ASCII এ লিখতে পারবেন না (কারণ ASCII কেবল একই অক্ষর ধারণ করে না)। আপনি এটি স্ট্রিং পলায়ন হিসাবে লিখতে পারেন (f2 হিসাবে); এই ক্ষেত্রে, ফাইলটিকে ASCII হিসাবে উপস্থাপন করা যেতে পারে। অথবা আপনি এটি ইউটিএফ -8 হিসাবে লিখতে পারেন, সেক্ষেত্রে আপনার একটি 8-বিট নিরাপদ প্রবাহ প্রয়োজন।

আপনার সমাধানটি ব্যবহার decode('string-escape')করে কাজ করে তবে আপনি কতটা স্মৃতি ব্যবহার করবেন তা আপনাকে অবশ্যই সচেতন হতে হবে: ব্যবহারের পরিমাণের তিনগুণ codecs.open()

মনে রাখবেন যে একটি ফাইল 8 টি বিট সহ কেবলমাত্র বাইটের ক্রম। বিট বা বাইটগুলির কোনওটিরই অর্থ নেই। আপনারা বলছেন "65 এর অর্থ 'এ'"। যেহেতু \xc3\xa1"à" হয়ে উঠতে হবে তবে কম্পিউটারটি জানার কোনও উপায় নেই, আপনাকে ফাইলটি লেখার সময় যে এনকোডিংটি ব্যবহার করা হয়েছিল তা নির্দিষ্ট করে জানিয়ে দিতে হবে।


আমি মনে করি এখানে কিছু টুকরো অনুপস্থিত রয়েছে: ফাইল এফ 2 এ রয়েছে: হেক্স: 0000000: 4361 7069 745c 7863 335c 7861 316e 0 ক ক্যাপিট \ xc3 \ xa1n। codecs.open ('f2', 'rb', 'utf-8'), উদাহরণস্বরূপ, সেগুলি পৃথক অক্ষরে পড়ে (প্রত্যাশিত) আসকি তে কোনও ফাইল লেখার কোনও উপায় আছে যা কাজ করবে?
গ্রেগ লিন্ড

6

ব্যতীত codecs.open(), কেউ io.open()ইউনিকোড ফাইলটি পড়তে / লিখতে পাইথন 2 বা পাইথন 3 এর সাথে কাজ করতে পারে

উদাহরণ

import io

text = u'á'
encoding = 'utf8'

with io.open('data.txt', 'w', encoding=encoding, newline='\n') as fout:
    fout.write(text)

with io.open('data.txt', 'r', encoding=encoding, newline='\n') as fin:
    text2 = fin.read()

assert text == text2


হ্যাঁ, আইও ব্যবহার করা আরও ভাল; কিন্তু আমি এই মত বিবৃতি দিয়ে লিখেছিলেন with io.open('data.txt', 'w', 'utf-8') as file:এবং একটি ত্রুটি করেছেন: TypeError: an integer is required। আমি পরিবর্তিত হওয়ার পরে with io.open('data.txt', 'w', encoding='utf-8') as file:এবং এটি কাজ করে।
ইভান হু

5

ঠিক আছে, আপনার প্রিয় পাঠ্য সম্পাদক বুঝতে পারবেন না যে \xc3\xa1চরিত্রটি আক্ষরিক বলে মনে করা হয়, তবে এটি তাদের পাঠ্য হিসাবে ব্যাখ্যা করে। এজন্য আপনি শেষ লাইনে ডাবল ব্যাকস্ল্যাশগুলি পান - এটি এখন xc3আপনার ফাইলে আসল ব্যাকস্ল্যাশ + ইত্যাদি।

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

টার্মিনাল এবং অ্যাপ্লিকেশনগুলির মধ্যে পাঠ্য আটকানো কঠিন, কারণ আপনি জানেন না কোন প্রোগ্রামটি কোন এনকোডিং ব্যবহার করে আপনার পাঠ্যকে ব্যাখ্যা করবে। আপনি নিম্নলিখিত চেষ্টা করতে পারেন:

>>> s = file("f1").read()
>>> print unicode(s, "Latin-1")
Capitán

তারপরে আপনার সম্পাদকটিতে এই স্ট্রিংটি পেস্ট করুন এবং নিশ্চিত করুন যে এটি ল্যাটিন -1 ব্যবহার করে এটি সঞ্চয় করে। এই অনুমানের অধীনে যে ক্লিপবোর্ড স্ট্রিংটি গারবে না, রাউন্ড ট্রিপটি কাজ করা উচিত।


4

.. x .. অনুক্রমটি পাইথনের সাথে নির্দিষ্ট। এটি সর্বজনীন বাইট পালানোর ক্রম নয়।

আপনি কীভাবে ইউটিএফ-8-এনকোডযুক্ত নন-এএসসিআইআইতে আসলে প্রবেশ করেন তা আপনার ওএস এবং / অথবা আপনার সম্পাদকের উপর নির্ভর করে। উইন্ডোজে আপনি এটি কীভাবে করেন তা এখানে । OS X এর প্রবেশ করার জন্য একটি তীব্র অ্যাকসেন্ট সহ আপনি শুধু মারতে পারেন option+ + E, তারপর AOS X এর সমর্থন হল UTF-8, এবং প্রায় সব টেক্সট এডিটর।


3

আপনি open()ইউনিকোড ফাইলগুলি স্থানে রেখে partialফাংশনটি ব্যবহার করে এটির সাথে কাজ করতে মূল ফাংশনটি উন্নত করতে পারেন । এই সমাধানটির সৌন্দর্য হ'ল আপনার কোনও পুরানো কোড পরিবর্তন করার দরকার নেই। এটা স্বচ্ছ।

import codecs
import functools
open = functools.partial(codecs.open, encoding='utf-8')

1

আমি বিশ্লেষণ করতে চেষ্টা ছিল মাসের পাইথন 2.7.9 ব্যবহার করছে:

আইক্যাল্যান্ডার আমদানি ক্যালেন্ডার থেকে

কিন্তু আমি পাচ্ছিলাম:

 Traceback (most recent call last):
 File "ical.py", line 92, in parse
    print "{}".format(e[attr])
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 7: ordinal not in range(128)

এবং এটি ঠিক দ্বারা স্থির করা হয়েছিল:

print "{}".format(e[attr].encode("utf-8"))

(এখন এটি পছন্দ মতো মুদ্রণ করতে পারে))


0

পুরো স্ক্রিপ্টটির ডিফল্ট এনকোডিংকে 'ইউটিএফ -8' হিসাবে পরিবর্তন করে আমি সবচেয়ে সহজ পন্থা পেয়েছি:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

কোন open, printবা অন্যান্য বিবৃতি মাত্র ব্যবহার করবে utf8

কমপক্ষে জন্য কাজ করে Python 2.7.9

Thx https://markhneedham.com/blog/2015/05/21/python-unicodeencodeerror-ascii-codec-cant-encode-character-uxfc-in-position-11-ordinal-not-in-range128/ এ যায় ( শেষ তাকান)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.