یونیکد و رمزگذاری
چرا این بحث مهمه؟
- هر متنی که کامپیوتر ذخیره/منتقل میکنه، در نهایت بهصورت بایت هست
- برای تبدیل بین کاراکتر و بایت، به یک استاندارد رمزگذاری (Encoding) نیاز داریم
یونیکد (Unicode) چیست؟
- استانداردی که به هر کاراکتر (از هر زبانی — فارسی، انگلیسی، ایموجی و…) یک عدد یکتا (Code Point) اختصاص میده
- در پایتون ۳، رشتهها (
str) بهصورت پیشفرض یونیکد هستن
print(ord('A')) # 65 -> کد یونیکد کاراکتر
print(chr(65)) # 'A' -> کاراکتر متناظر با کد
print(ord('س')) # کد یونیکد حرف فارسیرمزگذاری (Encoding) چیست؟
- روش تبدیل کاراکتر یونیکد به دنبالهای از بایتها (برای ذخیره در فایل یا ارسال روی شبکه)
- رایجترین:
UTF-8
| encoding | ویژگی |
|---|---|
| UTF-8 | استاندارد، پشتیبانی از همه زبانها، حجم بهینه — پیشفرض پایتون |
| ASCII | فقط حروف انگلیسی و علائم پایه |
| UTF-16 / UTF-32 | فضای بیشتر، کمتر رایج در وب |
تبدیل بین str و bytes
s = "سلام دنیا"
b = s.encode('utf-8') # str -> bytes
print(b)
print(type(b)) # <class 'bytes'>
s2 = b.decode('utf-8') # bytes -> str
print(s2) # سلام دنیاخطای رایج: UnicodeDecodeError
- وقتی بایتهایی رو با encoding اشتباه بخوایم decode کنیم
b = "سلام".encode('utf-8')
b.decode('ascii') # خطا! چون ascii فارسی رو نمیشناسهUnicodeDecodeError: 'ascii' codec can't decode byte...
نکته مهم: خواندن فایل با encoding درست
- اگه فایل با UTF-8 ذخیره شده ولی با encoding اشتباه باز بشه، متن بههم میریزه
with open('data.txt', encoding='utf-8') as f:
text = f.read()نکته کلاسی: اگه هنگام باز کردن فایل متنی، محتوا بهصورت کاراکترهای عجیب یا خطا نمایش داده شد، اولین چیزی که باید چک کرد encoding فایله
نکته: UnicodeEncodeError
- برعکس حالت قبل، وقتی بخوایم رشتهای رو با یک encoding محدود ذخیره کنیم که پشتیبانی نمیکنه
"سلام".encode('ascii')UnicodeEncodeError: 'ascii' codec can't encode characters...
جمعبندی
str= کاراکتر (یونیکد) → برای نمایش و پردازش متنbytes= بایت خام → برای ذخیره/انتقال- تبدیل:
str → bytesبا.encode()،bytes → strبا.decode() - همیشه
UTF-8رو بهعنوان پیشفرض ترجیح بدیم مگه دلیل خاصی برای غیر اون باشه