একটি ইউনিকোড স্ট্রিংটি পাইথনের স্ট্রিংয়ে রূপান্তর করুন (অতিরিক্ত চিহ্ন সহ)


501

আপনি কীভাবে কোনও ইউনিকোড স্ট্রিংকে (characters $ ইত্যাদির মতো অতিরিক্ত অক্ষরযুক্ত) পাইথন স্ট্রিংয়ে রূপান্তর করবেন?


2
আমাদের কী পাইথন সংস্করণটি ব্যবহার করছেন এবং এটি আপনি কী ইউনিকোড স্ট্রিংকে কল করছেন তা আমাদের জানতে হবে। সংক্ষিপ্ত ইউনিকোড_ স্ট্রিংয়ে নিম্নলিখিতটি করুন যাতে মুদ্রার চিহ্নগুলি অন্তর্ভুক্ত করে যা বিরক্ত করছে: পাইথন ২.x: print type(unicode_string), repr(unicode_string)পাইথন ৩.x: print type(unicode_string), ascii(unicode_string)তারপরে আপনার প্রশ্নটি সম্পাদনা করুন এবং উপরের মুদ্রণ বিবরণের ফলাফল অনুলিপি / অনুলিপি করুন। ফলাফলগুলি আবার টাইপ করবেন না। আপনার এইচটিএমএলের শীর্ষের কাছাকাছি সন্ধান করুন এবং দেখুন যে আপনি এর মতো কিছু খুঁজে পেতে পারেন: <মেটা http-برابر = "বিষয়বস্তুর ধরণ" বিষয়বস্তু = "পাঠ্য / এইচটিএমএল; চরসেট = আইসো -8859
জন ম্যাচিন

3
আমি আপনাকে একটি ওয়েব অনুরোধ থেকে ইউনিকোড পেতে সন্দেহ। আপনি সম্ভবত ইউটিএফ -8 এনকোডড ইউনিকোড পাবেন।

27
@ লুটজ: "ইউটিএফ -8 এনকোডেড ইউনিকোড" কীভাবে ইউনিকোড নয়?
জলফ

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

6
@ জালফ: যদি এটি এনকোড করা থাকে ; এটি আর ইউনিকোড যেমন, আর নেইunicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
jfs

উত্তর:


571
title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'

24
প্রশ্নের উত্তরটিকে +1 উত্তর হিসাবে বলেছে, @ উইলিয়ামট্রুপের কোনও ফাইলকে ইউনিকোড সংরক্ষণ করতে না পারার সমস্যাটি সম্পূর্ণ আলাদা ইস্যুর মতো পৃথক প্রশ্নের উপযুক্ত বলে মনে হচ্ছে
মার্ক রডি

5
@ জন - এই উত্তরটি ওপি'র স্পষ্টির পূর্বাভাস দেয়।
ডমিনিক রজার

10
@ মার্ক রড্ডি: লিখিত হিসাবে তাঁর প্রশ্নটি হ'ল "ইউনিকোড স্ট্রিং" (তার অর্থ তিনি যেভাবেই চান) কিছু মুদ্রার চিহ্নকে একটি "পাইথন স্ট্রিং" (যাই হোক না কেন ...) রূপান্তর করতে পারেন এবং আপনি মনে করেন যে কিছু মুছে ফেলা হবে মুছে ফেলুন-অন্যান্য-অ্যাস্কি অক্ষরগুলি তার প্রশ্নের উত্তর দেয় ???
জন মাচিন

13
@ জনমচিন এটি শব্দের জন্য প্রশ্নের শব্দটির উত্তর দেয়: একটি স্ট্রিংকে একটিতে রূপান্তর করার একমাত্র উপায় হল যে অক্ষরগুলি ASCII তে প্রতিনিধিত্ব করা যায় না তাকে ফেলে দেওয়া বা রূপান্তর করা। সুতরাং আমার কাছ থেকে +1 unicodestr
ইজকাটা

4
@ লজকাটা: না, তা নয়। type(title) == unicode and type(title.encode('utf-8')) == str। কোনও ফাইলে সংরক্ষণ করা যেতে পারে এমন একটি বাইটারেস্টিং পেতে ইনপুটটিকে দূষিত করার দরকার নেই।
jfs

318

আপনার যদি ASCII-র অ-অক্ষর অনুবাদ করার প্রয়োজন না হয় তবে আপনি ASCII এ এনকোড ব্যবহার করতে পারেন:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>

4
দুর্দান্ত উত্তর। ঠিক আমার যা প্রয়োজন ছিল। এছাড়াও, মহান উপস্থাপনার প্রভাব দেখানোর জন্য ignoreবনামreplace
জনি ব্রুকস

বা a.encode('ascii', 'xmlcharrefreplace')দেয় 'aaa&#224;&#231;&#231;&#231;&#241;&#241;&#241;'
বব স্টেইন

type(a)হয় strপাইথন 3.6.8 এবং কোনো নেই encode()পদ্ধতি।
আলী টু

138
>>> text=u'abcd'
>>> str(text)
'abcd'

যদি স্ট্রিংটিতে কেবল আসকি অক্ষর থাকে।


18
এটি কেবল উইন্ডোতে কাজ করবে। অ-আস্কি চিহ্ন থাকলে সেখানে ভেঙে যায়।
ভানুয়ান

6
স্ট্রিংয়ের সামগ্রীটি যদি ইউনিকোড স্ট্রিংয়ে কেবল অ্যাস্কেই অক্ষর নয়, তবে এটি ভেঙে যায়। এটি করবেন না, আপনি পুরো জায়গা জুড়ে এলোমেলোভাবে ইউনিকোডএকনোডেরর ব্যতিক্রম পাবেন।
ডগ

11
এই উত্তরটি আমাকে সাহায্য করেছিল। যদি আপনি জানেন যে আপনার স্ট্রিংটি ascii এবং আপনার এটি আবার কোনও অ-ইউনিকোড স্ট্রিংয়ে ফেলে দেওয়া দরকার, এটি খুব কার্যকর।
বেদটপকর

113

আপনার যদি ইউনিকোড স্ট্রিং থাকে এবং আপনি এটি কোনও ফাইল বা অন্য ক্রমিক আকারে লিখতে চান তবে আপনাকে প্রথমে এটি নির্দিষ্ট উপস্থাপনায় এনকোড করতে হবে যা সঞ্চয় করা যায়। কয়েকটি ইউনিকোড এনকোডিং রয়েছে যেমন ইউটিএফ -16 (বেশিরভাগ ইউনিকোড অক্ষরের জন্য দুটি বাইট ব্যবহার করে) বা ইউটিএফ -8 (চরিত্রের উপর নির্ভর করে 1-4 বাইট / কোডপয়েন্ট) ইত্যাদি। স্ট্রিংটিকে একটি নির্দিষ্ট এনকোডিংয়ে রূপান্তর করতে আপনি ব্যবহার করতে পারেন:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

বাইটের এই কাঁচা স্ট্রিংটি কোনও ফাইলে লেখা যেতে পারে। তবে নোট করুন যে এটি আবার পড়ার সময়, অবশ্যই এটি অবশ্যই এনকোডিংয়ে রয়েছে তা অবশ্যই আপনাকে জানতে হবে এবং একই এনকোডিংটি ব্যবহার করে ডিকোড করুন।

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

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

মনে রাখবেন যে এই ফাইলগুলি ব্যবহার করা অন্য যে কোনও কিছু ফাইল অবশ্যই পড়তে চাইলে ফাইলটি এনকোডিংয়ের মধ্যে রয়েছে তা বুঝতে হবে। আপনি যদি কেবল একাই পড়েন / লেখেন তবে এটি সমস্যা নয়, অন্যথায় নিশ্চিত হয়ে নিন যে আপনি অন্য যে কোনও ফাইল ব্যবহার করে বোঝার মতো ফর্মটিতে লিখেছেন।

পাইথন 3-এ, ফাইল অ্যাক্সেসের এই ফর্মটি ডিফল্ট এবং বিল্ট-ইন openফাংশনটি একটি এনকোডিং প্যারামিটার গ্রহণ করবে এবং পাঠ্য মোডে খোলা ফাইলগুলির জন্য সর্বদা ইউনিকোড স্ট্রিংগুলিতে (পাইথন 3-এ ডিফল্ট স্ট্রিং অবজেক্ট) অনুবাদ করবে।


58

এখানে একটি উদাহরণ:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

1
কেউ কি ব্যাখ্যা করতে পারে কেন, যখন আমি utf8এখানে প্রদর্শিত হিসাবে ইউরো প্রতীকটি এনকোড করেছি , ফলাফলটি কেবল প্রশ্ন চিহ্ন? এখানে আমার পাইথনের একটি চিত্র , সংস্করণ 2.7.13। (আমি অন্যান্য ইউনিকোড অবজেক্টগুলিকে যেমন এনকোড করতে পারি u"Klüft"তবে ইউরো নয়?)
রেড পিটর

5

ঠিক আছে, আপনি যদি পাইথন 3 এ স্যুইচ / প্রস্তুত হন (যা কিছু পাইথন 2 কোডের সাথে পিছনের দিকের অসঙ্গতির কারণে নাও হতে পারে), আপনাকে কোনও রূপান্তর করতে হবে না; পাইথন 3-এ সমস্ত পাঠ্য ইউনিকোড স্ট্রিং দ্বারা উপস্থাপিত হয় যার অর্থ u'<text>'সিনট্যাক্সের আর ব্যবহার নেই । ফলস্বরূপ, বাইটগুলির স্ট্রিংগুলি আপনার কাছে রয়েছে যা ডেটা উপস্থাপন করতে ব্যবহৃত হয় (যা কোনও এনকোডযুক্ত স্ট্রিং হতে পারে)।

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

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


2
পাইথনে 3 টি স্ট্রিং ইউনিকোড স্ট্রিং। এগুলি কখনই এনকোড করা হয় না। আমি নীচের পাঠ্যটি দরকারী বলে খুঁজে পেয়েছি: joelonsoftware.com/articles/Unicode.html

তিনি এটিকে কোনও ফাইলে সংরক্ষণ করতে চান; আপনার উত্তর কীভাবে এতে সহায়তা করে?
জন মাচিন

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

@ গুগল: তিনি কী পেয়েছেন তা জানার এই মুহূর্তে কোনও তথ্য নেই, তার সংরক্ষণের সমস্যাটি কী তা একা ছেড়ে দিন। আমি তাকে কিছু তথ্য সরবরাহ করতে বলেছি - আমার উত্তর দেখুন।
জন মাচিন 16


2

ফাইলটিতে ইউনিকোড-এস্যাপেড স্ট্রিং রয়েছে

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",

আমার জন্য

 f = open("56ad62-json.log", encoding="utf-8")
 qq=f.readline() 

 print(qq)                          
 {"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}

(qq.encode().decode("unicode-escape").encode().decode("unicode-escape")) 
# '{"log":"message": "Авторизация пользователя"}\n'

2
এটি কেবলমাত্র আমি ব্যবহার করলেও এটি কাজ করেছিল:result.encode().decode('unicode-escape')
আম্মাদ খালিদ

0

কোনও উত্তরদাতা আমার মামলার পক্ষে কাজ করেনি, যেখানে আমার কাছে ইউনিকোড অক্ষরযুক্ত স্ট্রিং ভেরিয়েবল ছিল, এবং এখানে কোনও এনকোড-ডিকোড বর্ণিত কাজটি করেনি।

আমি যদি টার্মিনালে করি

echo "no me llama mucho la atenci\u00f3n"

অথবা

python3
>>> print("no me llama mucho la atenci\u00f3n")

আউটপুট সঠিক:

output: no me llama mucho la atención

তবে এই স্ট্রিং ভেরিয়েবলটি লোড করে স্ক্রিপ্টগুলি নিয়ে কাজ করা কার্যকর হয়নি।

আমার ক্ষেত্রে এটিই কাজ করেছিল , ক্ষেত্রে যদি কাউকে সহায়তা করে:

string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención

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