رمزگذاری های ASCII، Unicode و UTF-8
کامپیوترها تنها با اعداد سروکار دارند (۰ و ۱) نه با حروف، بنابراین مهم است که همه کامپیوترها بر سر آنکه چه اعدادی نمایش دهنده چه حروفی باشند به توافق برسند…
فرض کنیم کامپیوتر من عدد ۱ را برای A، عدد ۲ را برای B، عدد ۳ را برای C و … و کامپیوتر شما عدد ۰ را برای A، عدد ۱ را برای B و … استفاده کنند. اگر من پیغام HELLO را برای شما ارسال کنم اعداد ۸، ۵، ۱۲، ۱۲ و ۱۵ برای شما ارسال میشوند اما در کامپیوتر شما ۸ به معنای I است پس وقتی کامپیوتر شما پیغام را دریافت میکند آن را به صورت IFMMP نشان میدهد. برای برقراری ارتباط موثر، ما نیاز داریم تا بر سر یک روش استاندارد برای رمزگذاری (encoding) کاراکترها به توافق برسیم.
برای این منظور، در سال ۱۹۶۰ انجمن استانداردهای آمریکا یک رمزگذاری ۷ بیتی که American Standard Code for Information Interchange (ASCII) نامیده میشود، ایجاد کرد. در این روش رمزگذاری HELLO اعداد ۷۲, ۶۹, ۷۶, ۷۶, ۷۹ است و به صورت دیجیتالی بدین گونه ۱۰۰۱۰۰۰ ۱۰۰۰۱۰۱ ۱۰۰۱۱۰۰ ۱۰۰۱۱۰۰ ۱۰۰۱۱۱۱ منتقل میشوند.
با استفاده از ۷ بیت، ۱۲۸ مقدار ممکن از ۰۰۰۰۰۰۰ تا ۱۱۱۱۱۱۱ خواهد بود بنابراین ASCII دارای فضای کافی برای همه حروف کوچک و بزرگ لاتین همراه با همه رقمها، علائم نقطه گذاری مشترک، فاصلهها (spaces)، تبها (tabs) و کاراکترهای کنترلی دیگر است. در سال ۱۹۶۸ Lyndon B. Johnson رییس جمهور ایالات متحده آن را رسمی کرد – تمام کامپیوترها باید ASCII را استفاده و درک کنند.
در اواخر ۱۹۸۰ یک استاندارد جدید پیشنهاد شد که یک شماره منحصر به فرد (که به طور رسمی به عنوان code point شناخته میشد) را به هر حرف در هر زبان اختصاص میداد. در این روش بیشتر از ۲۵۶ مقدار مورد نیاز بود. این روش Unicode (یونیکد) نامیده شد. ورژن یونیکد هم اکنون ۶٫۱ و شامل بیش ۱۱۰۰۰۰ کد پوینت است.
۱۲۸ کد پوینت ابتدایی یونیکد همانند اَسکی هستند. محدوده ۱۲۸ تا ۲۵۵ شامل نمادهای ارز و سایر نمادهای معمول و کاراکترهای استرسدار (به عنوان کاراکترهای با علائم تشخیصی برای تلفظ [diacritical marks] شناخته میشوند) هستند، و بیشتر آن از ISO-8859-1 گرفته شدهاند. بعد از ۲۵۶، کاراکترهای استرسدار بسیار بیشتری قرار دارند. پس از ۸۸۰ به حروف یونانی میرسد، سپس سیریلیک، عبری، عربی، هندی، تایلندی، چینی، ژاپنی و کرهای از ۱۹۰۴ آغاز میشوند و بسیاری دیگر در این بین قرار دارند.
این مهم است که هر حرف به وسیله شماره منحصر به فرد خود نمایش داده میشود. حرف Я سیریلیکی همیشه ۱۰۷۱ و حرف α یونانی همیشه ۹۴۵ است. à همیشه ۲۲۴ و H هم ۷۲ است. توجه داشته باشید که این کد پوینتهای یونیکد به طور رسمی به صورت هگزادسیمال با U+ در ابتدای آنها نوشته میشوند. بنابراین کد پوینت یونیکد H به جای ۷۲ معمولاً به صورت U+0048 نوشته میشود (برای تبدیل هگزادسیمال [مبنای شانزده] به دسیمال [مبنای ده] : ۷۲ = ۴ * ۱۶ + ۸).
مشکل اصلی این است که بیشتر از ۲۵۶ تا از آنها وجود دارد. کاراکترهای بعد از ۲۵۶ در ۸ بیت جا نخواهند شد. هر چند یونیکد، مجموعه کاراکتری یا کد پیج نیست. بنابراین این مشکل کنسرسیوم یونیکد نیست. آنها فقط ایده را مطرح کردند و اجازه دادند تا هر کسی پیاده سازی خود را انجام دهد.
اگر مرورگرها میتوانند با کاراکترهای ۳۲ بیتی یونیکد کار کنند پس مشکل کجاست؟ مشکل در ارسال و دریافت و خواندن و نوشتن کاراکترهاست.
مشکل باقیست چون:
بسیاری از نرمافزارها و پروتکلهای ارسال/دریافت و خواندن/نوشتن با کاراکترهای ۸ بیتی کار میکنند.
با استفاده از ۳۲ بیت برای ارسال/ذخیره متن انگلیسی مقدار پهنای باند/فضای موردنیاز چهار برابر خواهد شد.
هر چند مرورگرها میتوانند بصورت داخلی با یونیکد کار کنند، هنوز باید برای مرورگر وب داده را از وب سرور بگیرید و دوباره برگردانید، و نیاز دارید تا آن را در یک فایل یا جایی در یک پایگاه داده ذخیره کنید. بنابراین هنوز به راهی نیاز دارید که ۱۱۰۰۰۰ کد پوینت یونیکد را تنها در ۸ بیت جا دهید.
تلاشهای مختلفی برای حل این مسأله انجام گرفته مثل UCS2 و UTF-16. اما در سالهای اخیر UTF-8 برنده بوده است که مخفف فرمت ۸ بیتی انتقال مجموعه کاراکتری جهانی (Universal Character Set Transformation Format 8 bit) است.
UTF-8 باهوش است و نسبتاً شبیه کلید Shift روی کیبورد کار میکند. به طور معمول هنگامی که شما H را از کیبورد میفشارید حرف کوچک h روی صفحه ظاهر میشود. اما اگر شما ابتدا Shift را فشار داده باشید، حرف بزرگ H ظاهر میشود.
UTF-8 با اعداد ۰ تا ۱۲۷ همانند اَسکی، ۱۹۲ تا ۲۴۷ به عنوان کلیدهای Shift و ۱۲۸ تا ۱۹۲ به عنوان کلیدهایی که با شیفت استفاده میشوند، رفتار میکند. برای مثال کاراکترهای ۲۰۸ و ۲۰۹ شما را به محدوده سیریلیک منتقل میکنند (شیفت میدهند). ۲۰۸ همراه با ۱۷۵ کاراکتر ۱۰۷۱ است که Я سیریلیک میشود. محاسبه دقیق آن به این صورت است: ۱۰۷۱ = (۶۴ % ۱۷۵) + ۶۴ * (۳۲ % ۲۰۸). کاراکترهای ۲۲۴ تا ۲۳۹ شبیه شیفت مضاعف (double shift) هستند. ۲۲۶ به دنبال آن ۱۹۰ و سپس ۱۲۸ کاراکتر ۱۲۱۶۰: ⾀ است. ۲۴۰ به بالا شیفت سه گانه (triple shift) است.
بنابراین UTF-8 یک رمزگذاری با عرض متغیر (variable-width) چند بایتی (multi-byte) است. چند بایتی به خاطر اینکه یک کاراکتر واحد شبیه Я بیشتر از یک بایت را برای مشخص شدن میگیرد. عرض متغیر به این دلیل که برخی از کاراکترها مثل H تنها یک بایت را میگیرند و برخی تا چهار بایت را اشغال میکنند.
بهتر از همه این است که با ASCII نیز سازگار است. بر خلاف برخی دیگر از راه حلهای پیشنهادی، هر سندی که تنها در ASCII با کاراکترهای ۰ تا ۱۲۷ نوشته شده کاملاً در UTF-8 معتبر است و همچنین موجب صرفه جویی در پهنای باند میشود.
ترجمه : سوران خضری