unicode_escape
সাধারণভাবে কাজ করে না
দেখা যাচ্ছে যে সমাধান string_escape
বা unicode_escape
সমাধানটি সাধারণভাবে কাজ করে না - বিশেষত, এটি প্রকৃত ইউনিকোডের উপস্থিতিতে কাজ করে না।
আপনি যদি নিশ্চিত হন যে প্রতিটি অ-এএসসিআইআই চরিত্র পালাতে পারে (এবং মনে রাখবেন, প্রথম 128 টি অক্ষরের বাইরে যে কোনও কিছু অ-এসসিআইআই নয়) unicode_escape
আপনার জন্য সঠিক কাজ করবে। তবে যদি আপনার স্ট্রিংটিতে ইতিমধ্যে কোনও আক্ষরিক অ-এসসিআইআই অক্ষর থাকে তবে জিনিসগুলি ভুল হয়ে যাবে।
unicode_escape
বাইটসকে ইউনিকোড পাঠ্যে রূপান্তর করতে মৌলিকভাবে ডিজাইন করা হয়েছে। তবে অনেক জায়গায় - উদাহরণস্বরূপ, পাইথন উত্স কোড - উত্স ডেটা ইতিমধ্যে ইউনিকোড পাঠ্য।
এটি সঠিকভাবে কাজ করার একমাত্র উপায় হ'ল যদি আপনি প্রথমে পাঠ্যকে বাইটে এনকোড করেন। ইউটিএফ -8 হ'ল সমস্ত পাঠ্যের জন্য বুদ্ধিমান এনকোডিং, তাই কাজ করা উচিত, তাই না?
নিম্নলিখিত উদাহরণগুলি পাইথন 3 এ রয়েছে, যাতে স্ট্রিং লিটারেলগুলি আরও পরিষ্কার হয় তবে পাইথন 2 এবং 3 উভয় ক্ষেত্রে একই সমস্যাটি কিছুটা পৃথক প্রকাশের সাথে বিদ্যমান।
>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape'))
naïve test
ঠিক আছে, এটা ভুল।
পাঠ্যগুলিতে পাঠ্যকে ডিকোড করে কোডেকগুলি ব্যবহার করার নতুন প্রস্তাবিত উপায়টি হ'ল codecs.decode
সরাসরি কল করা। এটা কি সাহায্য করে?
>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve test
একেবারেই না. (এছাড়াও, উপরেরটি পাইথন ২-এ একটি ইউনিকোড ইরর))
unicode_escape
কোডেক এর নাম সত্ত্বেও, সক্রিয় আউট অনুমান করা যে সমস্ত নন- ASCII বাইট ল্যাটিন -1 (ISO-8859-1-) এনকোডিং এ আছে। সুতরাং আপনি এটি এইভাবে করতে হবে:
>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve test
তবে তা ভয়ানক। এটি আপনাকে 256 ল্যাটিন -1 বর্ণগুলিতে সীমাবদ্ধ করে, যেন ইউনিকোড কখনও আবিষ্কার করা যায় নি!
>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)
সমস্যা সমাধানের জন্য একটি নিয়মিত ভাব প্রকাশ করা
(আশ্চর্যের বিষয়, আমাদের এখন দুটি সমস্যা নেই))
আমাদের যা করা দরকার তা হ'ল কেবলমাত্র সেই unicode_escape
জিনিসগুলিতে ডিকোডার প্রয়োগ করা যা আমরা নিশ্চিত হ'ল ASCII পাঠ্য। বিশেষত, আমরা কেবল এটি বৈধ পাইথন এস্কেপ সিকোয়েন্সগুলিতে প্রয়োগ করতে নিশ্চিত করতে পারি, যা ASCII পাঠ্য হওয়ার গ্যারান্টিযুক্ত।
পরিকল্পনাটি হ'ল, আমরা একটি নিয়মিত এক্সপ্রেশন ব্যবহার করে পালানোর সিকোয়েন্সগুলি খুঁজে পাব এবং re.sub
তাদের অচিহ্নবিহীন মান দিয়ে তাদের প্রতিস্থাপনের জন্য যুক্তি হিসাবে একটি ফাংশন ব্যবহার করব।
import re
import codecs
ESCAPE_SEQUENCE_RE = re.compile(r'''
( \\U........ # 8-digit hex escapes
| \\u.... # 4-digit hex escapes
| \\x.. # 2-digit hex escapes
| \\[0-7]{1,3} # Octal escapes
| \\N\{[^}]+\} # Unicode characters by name
| \\[\\'"abfnrtv] # Single-character escapes
)''', re.UNICODE | re.VERBOSE)
def decode_escapes(s):
def decode_match(match):
return codecs.decode(match.group(0), 'unicode-escape')
return ESCAPE_SEQUENCE_RE.sub(decode_match, s)
এবং এটি দিয়ে:
>>> print(decode_escapes('Ernő \\t Rubik'))
Ernő Rubik
'spam'+"eggs"+'''some'''+"""more"""
প্রক্রিয়াজাত স্ট্রিং যুক্ত আশা করতে পারেন ?