همه چیز درباره یونیکد
Unicode استانداردی است که نگاشتی بین تمامی کاراکترها با اعداد فراهم کرده است (البته این تعریف فنی نیست و فقط برای ارائه درکی از موضوع بیان شده)
آنچه برای کامپیوتر قابل فهم است بایت است و نه کاراکترهای رشته. قوانین تبدیل کاراکترهای یک رشته به بایت را encoding می گویند. دو نوع encoding متداول عبارتند از ASCII و Unicode.
Unicode Encoding می تواند UTF-8 یا UTF-16 و یا UTF-32 باشد (هنگام ذخیره یک فایل در notepad ویندور، منظور از unicode همان UTF-16 است)
َASCII برای هر کاراکتر یک بایت درنظر می گیرد (هر کاراکتر به عنوان یک عدد بین 0 تا 127 در 7 بیت ذخیره می شود- بیت علامت همیشه 0 است)
UTF-32 برای هر کاراکتر 4 بایت در نظر می گیرد (هر کاراکتر به عنوان یک عدد بین 00000000 - 0010FFFF در 21 بیت ذخیره می شود - 11 بیت اول همیشه 0 است)
UTF-16 برای هر کاراکتر 2 یا 4 بایت در نظر می گیرد (اگر عدد مربوط به کاراکتر بین 00000000 - 0000FFFF باشد در 2 بایت و اگر بین 00010000 - 0010FFFF باشد در 4 بایت ذخیره می شود)
UTF-8 برای هر کاراکتر می تواند 1 تا 4 بایت در نظر بگیرد (اگر عدد مربوط به کاراکتر بین 00000000 - 0000007F باشد همانند اسکی در یک بایت و اگر بین 00000080 - 000007FF باشد در 2 بایت و اگر بین 00000800 - 0000FFFF باشد در 3 بایت و اگر بین 00010000 - 001FFFFF باشد در 4 بایت) - در جدول زیر دو ردیف دیگر هم برای UTF-8 قرار دارد که خارج از محدوده یونیکد قرار می گیرند ولی از لحاظ تئوری UTF-8 قابلیت استفاده از آن برای پوشش همه اعداد قرار گرفته بین 0 تا 2^31 را دارد
Unicode | UTF-32 |
---|---|
00000000 - 0010FFFF |
00000000-000xxxxx-xxxxxxxx-xxxxxxxx |
Unicode | UTF-16 |
---|---|
00000000 - 0000FFFF | xxxxxxxx-xxxxxxxx |
00010000 - 0010FFFF | 110110yy-yyxxxxxx 110111xx-xxxxxxxx |
Unicode | UTF-8 |
---|---|
00000000 - 0000007F | 0xxxxxxxx |
00000080 - 000007FF | 110xxxxx 10xxxxxx |
00000800 - 0000FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
00010000 - 001FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
00200000 - 03FFFFFF* | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
04000000 - 7FFFFFFF* | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
مقاله ای در سایت مستندات پایتون دیدم که با زبان بسیار ساده به معرفی یونیکد پرداخته است.
در این پست چند نکته بسیار مختصر از مقاله را یاداشت کرده ام ولی خواندن کل مقاله را به علاقه مندان توصیه می کنم
- character: کوچکترین جز یک متن مثلا A
- code point: یک مقدار عددی که معمولا در مبنای 16 بیان می شود
- glyph: نمایش یک کاراکتر روی یک صفحه نمایش یا پرینتر و ... .فونت وظیفه تبدیل کاراکتر به glyph را بعهده دارد
- encoding: قوانین تبدیل یک رشته یونیکد به آرایه ای از بایتها. همه encodingها همه کاراکترهای یونیکد را پیشتیبانی نمی کنند مثلا ASCII Encoding اگر code point کمتر از 128 بود هر بایت معادل همان code point خواهد بود در غیر اینصورت این encoding نمی تواند آن را ارائه کند یا در مورد Latin-1 encoding یا همان ISO-8859-1 تنها code point های بین 0 تا 255 را پشتیبانی می کند
UTF-8 یکی از متداول ترین encodingها است. UTF مختصر شده Unicode Transformation Format است و عدد 8 در آن یعنی از اعداد 8 بیتی (1 بایتی) در این encoding استفاده شده است و شامل قوانین زیر می شود:
اگر code point کمتر از 128 بود همانند ASCII Encoding هر بایت معادل همان code point خواهد بود اما اگر code point بزرگتر از 127 بود (بر خلاف ASCII که قابل تبدیل code point های بیشتر از 127 به بایت را ندارد) به توالی از 2 یا 3 یا 4 بایت تبدیل می شود که هر بایت آن عددی بین 128 تا 255 است