ASCII و یونیکد: چیستند و به چه کار می‌آیند

رایانه فقط عدد می‌فهمد، پس هر حرفی که روی صفحه می‌بینید یک کد است. ASCII نخستین جدول کدی بود که استاندارد شد و یونیکد جدولی است که امروز برای نوشتن به هر زبانی استفاده می‌کنیم. اینجا می‌بینید چطور کار می‌کنند، دانستن کدام کدها مفید است، چرا گاهی به‌جای حرف‌های دارای نشانه نمادهای عجیب ظاهر می‌شود و چطور همه را در جدول ببینید.

به‌روزرسانی:

رمزگذاری نویسه چیست

رمزگذاری یک توافق است: «عدد 65 یعنی حرف A». وقتی متنی می‌نویسید، برنامه آن عددها را ذخیره می‌کند؛ وقتی شخص دیگری آن را باز می‌کند، برنامه‌اش با همان توافق دوباره آن‌ها را به حرف ترجمه می‌کند. اگر هر دو از یک جدول استفاده نکنند، متن خراب درمی‌آید.

باید دو مفهوم را از هم جدا کرد. یکی مجموعه نویسه‌هاست، فهرست اینکه کدام عدد با کدام نماد مطابقت دارد. دیگری اینکه آن عددها چطور در بایت‌ها ذخیره می‌شوند. در ASCII این دو به شکل بدیهی یکی هستند؛ در یونیکد نه، و اینجاست که UTF-8 وارد می‌شود.

ASCII: 128 نویسه با 7 بیت

ASCII (مخفف American Standard Code for Information Interchange) در دهه 1960 استاندارد شد. از 7 بیت استفاده می‌کند، یعنی 2 به توان 7 = 128 کد، از 0 تا 127. از این‌ها 33 نویسه کنترلی هستند (از 0 تا 31 و 127) و 95 قابل چاپ (از 32 تا 126، با فاصله).

حروف دارای نشانه، ñ و علامت یورو را شامل نمی‌شود: برای انگلیسی طراحی شده بود. همین توضیح می‌دهد چرا بعداً به جدول‌های دیگر نیاز شد.

کدهایی که بیشتر با آن‌ها روبه‌رو می‌شوید. فاصله (32) با اینکه دیده نمی‌شود قابل چاپ حساب می‌شود.
نویسه کنترلیدهدهیهگزادسیمالدودویی (7 بیت)کاربرد
تهی (NUL)0000000000پایان یک رشته را در چند زبان مشخص می‌کند
جدول‌گذار افقی (TAB)9090001001به جدول‌گذار بعدی می‌پرد
خط جدید (LF)100A0001010به خط بعدی می‌رود
بازگشت به ابتدای خط (CR)130D0001101به ابتدای خط برمی‌گردد
گریز (ESC)271B0011011دنباله‌های کنترلی را آغاز می‌کند
فاصله32200100000نخستین نویسه قابل چاپ
حذف (DEL)1277F1111111نویسه را پاک می‌کند

رابطه‌هایی که خوب است به خاطر بسپارید

جدول به‌طور تصادفی مرتب نشده است. با چند قاعده می‌توانید کدها را از حفظ بخوانید.

پایان خط: LF، CR و CRLF

رفتن به خط بعد ساده به نظر می‌رسد، اما بسته به سیستم به شکل دیگری نوشته می‌شود. یونیکس، لینوکس و macOS از یک نویسه، LF (10)، استفاده می‌کنند. ویندوز از دو نویسه پشت‌سرهم، CR و LF (13 و 10)، استفاده می‌کند که CRLF نامیده می‌شود. تله‌تایپ‌های قدیمی به دو فرمان جدا نیاز داشتند: برگرداندن کالسکه به ابتدا و جلو بردن کاغذ به اندازه یک خط.

همین تفاوت دلیل فایل‌هایی است که در یک ویرایشگر ساده همه در یک خط دیده می‌شوند، یا در انتهای هر سطر نماد عجیبی دارند. اگر می‌خواهید بدانید هر کدام چه کدی دارند، LF یا CR را در جست‌وجوی جدول ASCII بنویسید.

«ASCII گسترش‌یافته» یک استاندارد نیست

چون یک بایت 8 بیت دارد و ASCII فقط از 7 بیت استفاده می‌کند، 128 کد آزاد (از 128 تا 255) باقی می‌ماند و هر سازنده و منطقه آن‌ها را به شکل خودش پر کرد. این به «ASCII گسترش‌یافته» معروف است، اما یک جدول واحد وجود ندارد: جدول‌های زیادی هستند که صفحه کد نام دارند. دو تا از معروف‌ترین‌ها Latin-1 (ISO-8859-1) هستند، که در آن é کد 233 است، و Windows-1252 که شبیه آن است اما در کدهای 128 تا 159 تفاوت‌هایی دارد (مثلاً یورو آنجاست).

مشکل این است که کد 233 در یک جدول «é» معنی می‌دهد و در جدول دیگر چیز دیگری. متنی که با یک جدول نوشته و با جدول دیگر خوانده می‌شد، آشغال نشان می‌داد. یونیکد برای پایان دادن به این بی‌نظمی به وجود آمد.

یونیکد و UTF-8

یونیکد به هر نویسه تقریباً همه سیستم‌های نوشتاری جهان، به‌اضافه نمادها و اموجی‌ها، یک عدد یگانه به نام نقطه کد می‌دهد. امروز بیش از 150000 نویسه دارد. با پیشوند U+ و در هگزادسیمال نوشته می‌شود: «A» برابر U+0041 است، «ñ» برابر U+00F1، یورو U+20AC و اموجی صورت خندان U+1F600. 128 نقطه کد اول دقیقاً همان‌های ASCII هستند.

UTF-8 پرکاربردترین شکل ذخیره آن عددها در بایت‌هاست و بسته به نویسه از 1 تا 4 بایت به کار می‌برد. 128 نویسه ASCII یک بایت می‌گیرند که با همیشه یکسان است، پس هر متن ASCII یک متن UTF-8 معتبر هم هست. بقیه بایت‌های بیشتری می‌گیرند.

هرچه از ASCII دورتر باشید، نویسه بایت بیشتری می‌گیرد.
نویسهنقطه کدبایت در UTF-8بایت‌ها (هگزادسیمال)
AU+0041141
éU+00E92C3 A9
ñU+00F12C3 B1
€U+20AC3E2 82 AC
😀U+1F6004F0 9F 98 80

چرا به‌جای «ñ» عبارت «Ã±» ظاهر می‌شود

این رایج‌ترین خطاست و توضیحی دقیق دارد. ñ در UTF-8 دو بایت است: C3 و B1. اگر برنامه‌ای فکر کند متن Latin-1 است، هر بایت را یک نویسه می‌خواند: C3 می‌شود «Ã» و B1 می‌شود «±». نتیجه: «Ã±». همین اتفاق برای «é» می‌افتد که «Ã©» دیده می‌شود، و برای «canción» که «canción» ظاهر می‌شود.

راه‌حل تقریباً همیشه این است که به برنامه بگویید فایل را به‌صورت UTF-8 باز کند (در یک ویرایشگر متن یا در تنظیمات وارد کردن یک صفحه‌گسترده). وقتی برعکس رخ می‌دهد، یعنی متن Latin-1 با UTF-8 خوانده شود، معمولاً لوزی‌هایی با علامت سؤال ظاهر می‌شوند، چون آن بایت‌های تک‌افتاده دنباله معتبر UTF-8 نمی‌سازند.

چطور از جدول ASCII و مبدل استفاده کنیم

ابزار «جدول ASCII» هر 128 نویسه را با کدشان در دهدهی، هگزادسیمال، هشتایی و دودویی و نام نویسه‌های کنترلی نشان می‌دهد.

  1. در جست‌وجو یک نویسه، یک کد یا نام یکی از نویسه‌های کنترلی (مثلاً A، 65، 41 یا LF) را بنویسید تا ردیف آن را پیدا کنید.
  2. از دکمه‌های فیلتر (کنترلی، ارقام، حروف بزرگ، حروف کوچک، علائم) برای دیدن فقط یک گروه استفاده کنید.
  3. برای تبدیل، متنی را در «متن» بنویسید و قالب را (دهدهی، هگزادسیمال، هشتایی یا دودویی) انتخاب کنید: کدها در پایین ظاهر می‌شوند. «Hola» در دهدهی 72 111 108 97 و در هگزادسیمال 48 6F 6C 61 می‌دهد.
  4. برعکس هم می‌توانید: کدها را با فاصله یا ویرگول در «کدها» جای‌گذاری کنید تا متن ساخته شود. در هگزادسیمال پیشوندهایی مثل 0x41 پذیرفته می‌شوند.

اگر متن نویسه‌هایی غیر ASCII داشته باشد، مثل ñ، ابزار اطلاع می‌دهد و کد یونیکد آن را نشان می‌دهد. برای دیدن بایت‌های واقعی در UTF-8 از «تبدیل متن به باینری» استفاده کنید: ñ برابر 11000011 10110001 می‌دهد، دو بایت 8 بیتی. محدودیت‌ها: جدول فقط ASCII استاندارد را نشان می‌دهد، نه گسترش‌یافته، و همه‌چیز در مرورگر شما بدون ارسال متن به هیچ سروری محاسبه می‌شود.

پرسش‌های متداول

ASCII چند نویسه دارد؟

128 نویسه، با کدهای 0 تا 127 و 7 بیت برای هرکدام. از این‌ها 33 کنترلی و 95 قابل چاپ هستند، با احتساب فاصله.

کد ASCII حرف A و حرف a چیست؟

«A» برابر 65 است (41 در هگزادسیمال، 01000001 در دودویی) و «a» برابر 97 (61 در هگزادسیمال، 01100001 در دودویی). همیشه 32 تفاوت دارند.

تفاوت ASCII و یونیکد چیست؟

ASCII دارای 128 نویسه است که برای انگلیسی طراحی شده‌اند. یونیکد بیش از 150000 نویسه از تقریباً همه زبان‌ها و اموجی‌ها دارد و 128 نویسه اولش همان‌های ASCII هستند.

UTF-8 چیست؟

پرکاربردترین شکل ذخیره متن یونیکد در بایت‌هاست. برای هر نویسه از 1 تا 4 بایت استفاده می‌کند: نویسه‌های ASCII یک بایت می‌گیرند، ñ دو بایت و یک اموجی چهار بایت.

چرا متن من «Ã±» یا «Ã©» نشان می‌دهد؟

چون متنی که با UTF-8 ذخیره شده است به‌عنوان Latin-1 خوانده می‌شود. فایل را با مشخص کردن رمزگذاری UTF-8 باز کنید تا درست شود.