رمزگذاری نویسه چیست
رمزگذاری یک توافق است: «عدد 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، با فاصله).
حروف دارای نشانه، ñ و علامت یورو را شامل نمیشود: برای انگلیسی طراحی شده بود. همین توضیح میدهد چرا بعداً به جدولهای دیگر نیاز شد.
| نویسه کنترلی | دهدهی | هگزادسیمال | دودویی (7 بیت) | کاربرد |
|---|---|---|---|---|
| تهی (NUL) | 0 | 00 | 0000000 | پایان یک رشته را در چند زبان مشخص میکند |
| جدولگذار افقی (TAB) | 9 | 09 | 0001001 | به جدولگذار بعدی میپرد |
| خط جدید (LF) | 10 | 0A | 0001010 | به خط بعدی میرود |
| بازگشت به ابتدای خط (CR) | 13 | 0D | 0001101 | به ابتدای خط برمیگردد |
| گریز (ESC) | 27 | 1B | 0011011 | دنبالههای کنترلی را آغاز میکند |
| فاصله | 32 | 20 | 0100000 | نخستین نویسه قابل چاپ |
| حذف (DEL) | 127 | 7F | 1111111 | نویسه را پاک میکند |
رابطههایی که خوب است به خاطر بسپارید
جدول بهطور تصادفی مرتب نشده است. با چند قاعده میتوانید کدها را از حفظ بخوانید.
- رقمهای «0» تا «9» از 48 تا 57 هستند (30 تا 39 در هگزادسیمال). مقدار یک رقم کد آن منهای 48 است: «7» برابر 55 است و 55 − 48 = 7.
- حروف بزرگ از 65 («A») تا 90 («Z») و حروف کوچک از 97 («a») تا 122 («z») هستند.
- تفاوت یک حرف بزرگ با کوچک آن همیشه 32 است: «A» = 65 و «a» = 97؛ «C» = 67 و «c» = 99. در دودویی فقط یک بیت عوض میشود: 01000001 برای «A» و 01100001 برای «a».
- برای فهمیدن جایگاه یک حرف بزرگ در الفبا، 64 را کم کنید: «C» برابر 67 است و 67 − 64 = 3، یعنی حرف سوم.
- چون همه حروف بزرگ (65 تا 90) کدهایی کوچکتر از حروف کوچک (97 تا 122) دارند، ترتیب الفبایی «بر اساس کد» «Zebra» را قبل از «apple» میگذارد. بسیاری از برنامهها برای مرتبسازی درست به گزینه مقایسه جداگانه نیاز دارند.
پایان خط: 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 معتبر هم هست. بقیه بایتهای بیشتری میگیرند.
| نویسه | نقطه کد | بایت در UTF-8 | بایتها (هگزادسیمال) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ñ | U+00F1 | 2 | C3 B1 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 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 نویسه را با کدشان در دهدهی، هگزادسیمال، هشتایی و دودویی و نام نویسههای کنترلی نشان میدهد.
- در جستوجو یک نویسه، یک کد یا نام یکی از نویسههای کنترلی (مثلاً A، 65، 41 یا LF) را بنویسید تا ردیف آن را پیدا کنید.
- از دکمههای فیلتر (کنترلی، ارقام، حروف بزرگ، حروف کوچک، علائم) برای دیدن فقط یک گروه استفاده کنید.
- برای تبدیل، متنی را در «متن» بنویسید و قالب را (دهدهی، هگزادسیمال، هشتایی یا دودویی) انتخاب کنید: کدها در پایین ظاهر میشوند. «Hola» در دهدهی 72 111 108 97 و در هگزادسیمال 48 6F 6C 61 میدهد.
- برعکس هم میتوانید: کدها را با فاصله یا ویرگول در «کدها» جایگذاری کنید تا متن ساخته شود. در هگزادسیمال پیشوندهایی مثل 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 باز کنید تا درست شود.