از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
بایت ها را به رشته در پایتون تبدیل کنید
سرفصلهای مطلب
معرفی
در این مقاله نگاهی خواهیم داشت روش تبدیل بایت ها به رشته در پایتون. در پایان این مقاله، ایده روشنی در مورد اینکه این انواع چیست و چگونه به طور موثر داده ها را با استفاده از آنها مدیریت کنید، خواهید داشت.
بسته به روی نسخه پایتونی که از آن استفاده می کنید، این کار متفاوت خواهد بود. اگرچه پایتون 2 به پایان عمر خود رسیده است، بسیاری از پروژه ها هنوز از آن استفاده می کنند، بنابراین ما هر دو رویکرد Python 2 و Python 3 را در نظر خواهیم گرفت.
تبدیل بایت ها به رشته در پایتون 3
از زمان پایتون 3، روش قدیمی ASCII برای انجام کارها باید از بین می رفت و پایتون کاملاً یونیکد شد.
این بدان معنی است که ما نوع یونیکد صریح را از دست دادیم: u"string"
– هر رشته یک است u"string"
!
برای متمایز کردن این رشته ها از بایتسترینگ های خوب قدیمی، ما با یک مشخص کننده جدید برای آنها آشنا شده ایم – b"string"
.
این در پایتون 2.6 اضافه شد، اما هدف واقعی دیگری جز آماده شدن برای پایتون 3 نبود، زیرا همه رشتهها در نسخه 2.6 بای تست بودند.
Bytestring ها در پایتون 3 به طور رسمی نامیده می شوند bytes
، یک دنباله تغییرناپذیر از اعداد صحیح در محدوده 0 <= x < 256. یکی دیگر bytes
شی مانند اضافه شده در 2.6 است bytearray
– شبیه به bytes
، اما قابل تغییر است.
بایت ها را به رشته تبدیل کنید رمزگشایی ()
بیایید نگاهی بیندازیم که چگونه میتوانیم بایتها را با استفاده از داخلی به یک رشته تبدیل کنیم decode()
روش برای bytes
کلاس:
>>> b = b"Lets grab a \xf0\x9f\x8d\x95!"
>>> type(b)
<class 'bytes'>
# Now, let's decode/convert them into a string
>>> s = b.decode('UTF-8')
>>> s
"Let's grab a 🍕!"
با عبور از فرمت رمزگذاری، ما آن را رمزگشایی کرده ایم bytes
شی را در یک رشته قرار داد و آن را چاپ کرد.
بایت ها را به رشته تبدیل کنید کدک ها
از طرف دیگر، می توانیم از داخلی استفاده کنیم codecs
ماژول برای این منظور نیز:
>>> import codecs
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'
>>> codecs.decode(b, 'UTF-8')
"Let's grab a 🍕!"
واقعا اینطور نیست نیاز برای عبور در پارامتر رمزگذاری، با این حال، توصیه میشود که آن را وارد کنید:
>>> codecs.decode(b)
"Let's grab a 🍕!"
بایت ها را به رشته تبدیل کنید str()
در نهایت می توانید از str()
تابعی که مقادیر مختلف را می پذیرد و آنها را به رشته تبدیل می کند:
>>> b = b'Lets grab a \xf0\x9f\x8d\x95!'
>>> str(b, 'UTF-8')
"Let's grab a 🍕!"
اطمینان حاصل کنید که آرگومان رمزگذاری را به str()
اگرچه، در غیر این صورت ممکن است نتایج غیرمنتظره ای دریافت کنید:
>>> str(b)
b'Lets grab a \xf0\x9f\x8d\x95!'
این ما را یک بار دیگر به رمزگذاری می رساند. اگر رمزگذاری اشتباهی را مشخص کنید، بهترین حالت این است که برنامه شما از کار بیفتد زیرا نمی تواند داده ها را رمزگشایی کند. به عنوان مثال، اگر ما سعی کردیم با استفاده از str()
عملکرد با UTF-16
، از ما استقبال می شود:
>>> str(b, 'UTF-16')
'敌❴\u2073牧扡愠\uf020趟↕'
با توجه به اینکه پایتون 3 دوست دارد یونیکد را فرض کند، این مهمتر است – بنابراین اگر با فایلها یا منابع دادهای کار میکنید که از رمزگذاری مبهم استفاده میکنند، حتما توجه بیشتری داشته باشید.
تبدیل بایت ها به رشته در پایتون 2
در پایتون 2، یک دسته از بایت ها و یک رشته عملاً یک چیز هستند – رشته ها اشیایی هستند که از کاراکترهای طولانی 1 بایت تشکیل شده اند، به این معنی که هر کاراکتر می تواند 256 مقدار را ذخیره کند. به همین دلیل است که گاهی اوقات به آنها می گویند توسط آزمون.
این هنگام کار با داده های بایت عالی است – ما فقط آن را در یک متغیر بارگذاری می کنیم و آماده هستیم print:
>>> s = "Hello world!"
>>> s
'Hello world!'
>>> len(s)
12
هر چند استفاده از کاراکترهای یونیکد در بایتسترینگ ها این رفتار را کمی تغییر می دهد:
>>> s = "Let's grab a 🍕!"
>>> s
'Lets grab a \xf0\x9f\x8d\x95!'
>>> len(s)
17
تبدیل بایت به یونیکد (پایتون 2)
در اینجا، ما باید از Python 2 استفاده کنیم Unicode
نوع، که در پایتون 3 فرض می شود و به طور خودکار استفاده می شود. این رشته ها را به عنوان یک سری از نقاط کد ذخیره می کند، نه بایت.
این \xf0\x9f\x8d\x95
بایت ها را به صورت اعداد هگز دو رقمی نشان می دهد زیرا پایتون نمی داند چگونه آنها را به عنوان کاراکترهای ASCII نشان دهد:
>>> u = u"Let's grab a 🍕!"
u"Let's grab a \U0001f355!""
>>> u
"Let's grab a 🍕!"
# Yum.
>>> len(u)
15
همانطور که در بالا می بینید، رشته یونیکد شامل \U0001f355
– یک شخصیت یونیکد فرار کرد که ما terminal حالا می داند چگونه print به عنوان یک تکه پیتزا! تنظیم آن به آسانی استفاده از آن بود u
مشخص کننده قبل از مقدار بای تست.
بنابراین، چگونه می توانم بین این دو سوئیچ کنم؟
شما می توانید رشته یونیکد را با رمزگشایی بایتستینگ خود دریافت کنید. این را می توان با ساخت یک شی یونیکد، ارائه بای تست و رشته ای حاوی نام رمزگذاری به عنوان آرگومان یا با فراخوانی انجام داد. .decode(encoding)
روی یک بایتستینگ
با استفاده از بایت ها را به رشته تبدیل کنید رمزگشایی () (پایتون 2)
شما همچنین می توانید استفاده کنید codecs.encode(s, encoding)
از codecs
مدول.
>>> s = "Let's grab a \xf0\x9f\x8d\x95!"
>>> u = unicode(s, 'UTF-8')
>>> u
"Let's grab a 🍕!"
>>> s.decode('UTF-8')
"Let's grab a 🍕!"
با استفاده از بایت ها را به رشته تبدیل کنید کدک ها (پایتون 2)
یا با استفاده از codecs
مدول:
import codecs
>>> codecs.decode(s, 'UTF-8')
"Let's grab a 🍕!"
مراقب رمزگذاری خود باشید
یک کلمه احتیاط در اینجا – بایت ها را می توان در رمزگذاری های مختلف به طور متفاوت تفسیر کرد. با اطراف 80 رمزگذاریهای مختلف در دسترس هستند، ممکن است تشخیص این که آیا کد مناسب را دارید یا نه، آسان نیست!
s = '\xf8\xe7'
>>> s.decode('UTF-8')
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf8 in position 0:
invalid start byte
# These two overlaps and this is a valid string in both
>>> s.decode('latin1')
øç
s.decode('iso8859_5')
јч
پیام اصلی یکی بود øç
یا јч
، و به نظر می رسد هر دو تبدیل معتبر هستند.
نتیجه
به عنوان برنامه نویس، مواردی وجود دارد که باید دائماً در مورد آنها فکر کنیم و فعالانه برای آنها آماده شویم تا از دام ها جلوگیری کنیم. این امر به ویژه صادق است روی سطوح پایین تر، جایی که وقتی از زبان سطح بالایی مانند پایتون به عنوان راننده روزانه خود استفاده می کنیم، به ندرت به آنجا می رویم.
چیزهایی مانند مجموعه نویسه ها، رمزگذاری ها و دودویی آنجا هستند تا به ما یادآوری کنند که وظیفه ما این است کد – برای رمزگذاری افکار خود به راه حل های کاری. خوشبختانه، بسیاری از این تفکرات پس از چند دور زدن با صفحه کلید به بخشی از روال ما تبدیل می شود.
در این مقاله به بررسی آن پرداختیم روش تبدیل بایت ها به رشته ها در پایتون.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-14 09:54:04