یونیکد و رمزگذاری

اصلاح شده

2026-07-25

چرا این بحث مهمه؟

  • هر متنی که کامپیوتر ذخیره/منتقل می‌کنه، در نهایت به‌صورت بایت هست
  • برای تبدیل بین کاراکتر و بایت، به یک استاندارد رمزگذاری (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 رو به‌عنوان پیش‌فرض ترجیح بدیم مگه دلیل خاصی برای غیر اون باشه