یونیکد یا یونیکد (از کلمه انگلیسی یونیکد) یک استاندارد رمزگذاری کاراکتر کاراکتر است. تقریباً تمام زبان های نوشتاری را قادر می سازد تا رمزگذاری شوند.
در اواخر دهه 1980، کاراکترهای 8 بیتی استاندارد شدند. رمزگذاری های 8 بیتی با تغییرات مختلفی نشان داده شد که تعداد آنها به طور مداوم در حال افزایش بود. این عمدتاً نتیجه گسترش فعال دامنه زبان های مورد استفاده بود. همچنین تمایل توسعه دهندگان برای ارائه رمزگذاری که حداقل ادعای جهانی بودن جزئی را داشته باشد وجود داشت.
در نتیجه، رسیدگی به چندین مشکل ضروری شد:
- مشکلات نمایش اسناد در کدگذاری نادرست میتوان آن را با معرفی مداوم روشهایی برای تعیین رمزگذاری مورد استفاده، یا با معرفی یک رمزگذاری واحد برای همه حل کرد.
- مشکلات بسته کاراکتر محدود، یا با تغییر فونت در سند، یا با معرفی رمزگذاری توسعه یافته حل می شود.
- مشکلات تبدیل رمزگذاری از یکی به دیگری، که به نظر میرسد با استفاده از یک تبدیل میانی (کدگذاری سوم)، شامل کاراکترهای رمزگذاریهای مختلف، یا ایجاد جداول تبدیل برای هر دو رمزگذاری، قابل حل است.
- مشکلات تکراری فونت های فردی به طور سنتی، هر کدگذاری فونت خاص خود را در نظر می گرفت، حتی زمانی که رمزگذاری ها به طور کامل یا تا حدی در مجموعه کاراکتر منطبق بودند. تا حدودی، مشکل با کمک فونت های "بزرگ" حل شد، که سپس کاراکترهای مورد نیاز برای یک رمزگذاری خاص انتخاب شدند. اما برای تعیین میزان انطباق، لازم بود یک ثبت واحد از نمادها ایجاد شود.
بنابراین، دستور کار این سوال را در مورد نیاز به ایجاد یک کدگذاری یکپارچه "گسترده" مطرح کرد. رمزگذاری طول کاراکترهای متغیر مورد استفاده در آسیای جنوب شرقی برای استفاده بسیار پیچیده بود. بنابراین بر استفاده از نماد با عرض ثابت تاکید شد. نمادهای 32 بیتی خیلی دست و پا گیر به نظر می رسیدند و در نهایت نمادهای 16 بیتی برنده شدند.
این استاندارد در سال 1991 توسط یک سازمان غیرانتفاعی به جامعه اینترنتی پیشنهاد شد کنسرسیوم یونیکد... استفاده از آن امکان رمزگذاری تعداد زیادی کاراکتر از انواع مختلف نوشتار را فراهم می کند. در اسناد یونیکد، نه حروف چینی، نه نمادهای ریاضی، نه سیریلیک و نه لاتین کاملاً مجاور نیستند. در عین حال، صفحات کد در حین کار نیازی به سوئیچ ندارند.
این استاندارد از دو بخش اصلی تشکیل شده است: یک مجموعه کاراکتر جهانی (UCS انگلیسی) و یک خانواده از رمزگذاری ها (در تفسیر انگلیسی - UTF). مجموعه کاراکتر جهانی تناسب یک به یک را با کدهای کاراکتر تنظیم می کند. کدها در این مورد عناصر دامنه کد هستند که اعداد صحیح غیر منفی هستند. عملکرد خانواده کدگذاری، تعریف نمایش ماشینی دنباله ای از کدهای UCS است.
در استاندارد یونیکد، کدها در چندین حوزه درجه بندی می شوند. ناحیه ای با کدهایی که با U + 0000 شروع می شوند و به U + 007F ختم می شوند - شامل کاراکترهای مجموعه ASCII با کدهای مورد نیاز است. علاوه بر این، مناطقی از نمادهای اسکریپت های مختلف، نمادهای فنی، علائم نقطه گذاری وجود دارد. یک دسته جداگانه از کدها برای استفاده در آینده در رزرو نگهداری می شود. الفبای سیریلیک مناطق کاراکتر زیر را با کدها تعریف می کند: U + 0400 - U + 052F، U + 2DE0 - U + 2DFF، U + A640 - U + A69F.
ارزش این رمزگذاری در فضای وب به شدت در حال افزایش است. سهم سایت هایی که از یونیکد استفاده می کردند در اوایل سال 2010 نزدیک به 50 درصد بود.
امروز با شما در مورد اینکه کراکوزیابرها از کجا در سایت و برنامه ها آمده اند، کدگذاری متنی وجود دارد و کدام یک باید استفاده شود، صحبت خواهیم کرد. اجازه دهید تاریخچه توسعه آنها را با جزئیات در نظر بگیریم، از ASCII پایه، و همچنین نسخه های توسعه یافته آن CP866، KOI8-R، Windows 1251 و پایان دادن به رمزگذاری های مدرن کنسرسیوم یونیکد UTF 16 و 8. فهرست مطالب:
- نسخه های توسعه یافته Asuka - رمزگذاری های CP866 و KOI8-R
- ویندوز 1251 - تنوع ASCII و چرا krakozyabry بیرون می آیند
ASCII - رمزگذاری متن اصلی برای الفبای لاتین
توسعه رمزگذاری های متنی همزمان با شکل گیری صنعت فناوری اطلاعات صورت گرفت و در این مدت آنها توانستند دستخوش تغییرات بسیار زیادی شوند. از لحاظ تاریخی، همه چیز با EBCDIC شروع شد، که در تلفظ روسی تقریباً خوشایند نبود، که امکان رمزگذاری حروف الفبای لاتین، اعداد عربی و علائم نگارشی را با کاراکترهای کنترلی ممکن می کرد. اما با این حال، نقطه شروع برای توسعه رمزگذاری متن مدرن، معروف است ASCII(کد استاندارد آمریکایی برای تبادل اطلاعات، که در روسی معمولا به عنوان "aski" تلفظ می شود). این 128 نویسه اول را توصیف می کند که بیشتر توسط کاربران انگلیسی زبان استفاده می شود - حروف لاتین، اعداد عربی و علائم نگارشی. حتی این 128 کاراکتر توصیف شده در ASCII شامل برخی از نمادهای خدماتی مانند براکت، خطوط هش، ستاره و غیره است. در واقع، شما خودتان می توانید آنها را ببینید:![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/15fe1a.png)
![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/0a7d12.png)
نسخه های توسعه یافته Asuka - رمزگذاری CP866 و KOI8-R با شبه نگاری
بنابراین، ما شروع به صحبت در مورد ASCII کردیم، که، همانطور که بود، نقطه شروعی برای توسعه همه رمزگذاری های مدرن (ویندوز 1251، یونیکد، UTF 8) بود. در ابتدا فقط شامل 128 کاراکتر از الفبای لاتین، اعداد عربی و چیزهای دیگر در آنجا بود، اما در نسخه توسعه یافته امکان استفاده از تمام 256 مقداری که می توانند در یک بایت اطلاعات رمزگذاری شوند، وجود داشت. آن ها اضافه کردن نمادهایی از حروف زبان خود به Aski امکان پذیر شد. در اینجا لازم است برای روشن شدن یک بار دیگر انحراف داشته باشیم - چرا اصلاً به رمزگذاری متن نیاز داریمو چرا اینقدر مهم است. نمادها بر روی صفحه نمایش رایانه شما بر اساس دو چیز تشکیل می شوند - مجموعه ای از اشکال برداری (نمایش) از انواع کاراکترها (آنها در فایل هایی با فونت هایی هستند که روی رایانه شما نصب شده اند) و کدی که به شما امکان می دهد دقیقاً همان یکی از این مجموعه اشکال برداری (فایل فونت) کاراکتری را که باید در محل مورد نظر درج شود، بیرون بکشید. واضح است که خود فونت ها مسئول فرم های برداری هستند، اما سیستم عامل و برنامه های استفاده شده در آن وظیفه کدنویسی را بر عهده دارند. آن ها هر متنی در رایانه شما مجموعه ای از بایت ها خواهد بود که هر کدام یک کاراکتر از همین متن را رمزگذاری می کند. برنامه ای که این متن را روی صفحه نمایش می دهد (ویرایشگر متن، مرورگر و غیره)، هنگام تجزیه کد، رمزگذاری کاراکتر بعدی را می خواند و در فایل فونت مورد نیاز به دنبال فرم برداری مربوطه می گردد که برای نمایش این وصل است. سند متنی همه چیز ساده و پیش پا افتاده است. این بدان معناست که برای رمزگذاری هر کاراکتری که نیاز داریم (مثلاً از الفبای ملی)، دو شرط باید رعایت شود - شکل برداری این کاراکتر باید با فونت استفاده شده باشد و این کاراکتر می تواند در رمزگذاری های ASCII توسعه یافته در کدگذاری شود. یک بایت بنابراین، یک دسته کامل از این گزینه ها وجود دارد. انواع مختلفی از Asuka توسعه یافته فقط برای رمزگذاری کاراکترهای زبان روسی وجود دارد. به عنوان مثال، در ابتدا ظاهر شد CP866، که در آن امکان استفاده از حروف الفبای روسی وجود داشت و نسخه توسعه یافته ASCII بود. آن ها قسمت بالای آن کاملاً با نسخه اصلی Asuka (128 کاراکتر لاتین، اعداد و هر چیز مزخرفی) مطابقت داشت که در تصویر بالا نشان داده شده است، اما قسمت پایین جدول با رمزگذاری CP866 نمای نشان داده شده در تصویر را داشت. در زیر و مجاز به رمزگذاری 128 علامت دیگر (حروف روسی و انواع شبه گرافیک):![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/a1391c.png)
![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/73e6b5.png)
ویندوز 1251 - نسخه مدرن ASCII و دلیل بیرون آمدن کراکوزیابری
توسعه بیشتر رمزگذاری متن با این واقعیت همراه بود که سیستم عامل های گرافیکی در حال افزایش محبوبیت بودند و نیاز به استفاده از شبه گرافیک در آنها با گذشت زمان ناپدید شد. در نتیجه، یک گروه کامل به وجود آمد که در اصل، هنوز نسخه های توسعه یافته Asuka بودند (یک کاراکتر متن تنها با یک بایت اطلاعات رمزگذاری شده است)، اما در حال حاضر بدون استفاده از شخصیت های شبه گرافیکی. آنها متعلق به کدهای به اصطلاح ANSI بودند که توسط مؤسسه استانداردهای آمریکایی توسعه یافتند. در اصطلاح رایج، نام الفبای سیریلیک هنوز برای نسخه با پشتیبانی از زبان روسی استفاده می شد. یک نمونه از این است ویندوز 1251... تفاوت مطلوبی با CP866 و KOI8-R که قبلاً استفاده شده بود از این جهت بود که نمادهای شبه گرافیکی در آن توسط نمادهای گمشده تایپوگرافی روسی (به جز علامت لهجه) و همچنین نمادهای مورد استفاده در زبان های اسلاوی گرفته شد. نزدیک به روسی (اوکراینی، بلاروسی و غیره) :![](https://i2.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/963d34.png)
![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/1443f6.png)
یونیکد - رمزگذاری جهانی UTF 8، 16 و 32
این هزاران کاراکتر از گروه زبان آسیای جنوب شرقی را نمیتوان در یک بایت اطلاعات توصیف کرد، که برای رمزگذاری کاراکترها در نسخههای توسعهیافته ASCII اختصاص داده شده است. در نتیجه کنسرسیومی به نام ایجاد شد یونیکد(یونیکد - کنسرسیوم یونیکد) با همکاری بسیاری از رهبران صنعت فناوری اطلاعات (کسانی که نرم افزار تولید می کنند، سخت افزار کدنویسی می کنند، فونت ایجاد می کنند) که علاقه مند به ظهور یک رمزگذاری متن جهانی بودند. اولین نسخه منتشر شده تحت نظارت کنسرسیوم یونیکد بود UTF 32... عدد در نام رمزگذاری به معنای تعداد بیت هایی است که برای رمزگذاری یک کاراکتر استفاده می شود. 32 بیت 4 بایت اطلاعات است که برای رمزگذاری یک کاراکتر در رمزگذاری جهانی UTF جدید مورد نیاز است. در نتیجه، همان فایل با متن کدگذاری شده در نسخه توسعه یافته ASCII و در UTF-32، در مورد دوم، اندازه (وزن) چهار برابر بیشتر خواهد داشت. این بد است، اما اکنون این فرصت را داریم که تعداد کاراکترهای برابر با دو را با توان سی و دوم رمزگذاری کنیم ( میلیاردها شخصیت، که هر مقدار واقعا ضروری را با یک حاشیه عظیم پوشش می دهد). اما بسیاری از کشورهای دارای زبان های گروه اروپایی نیازی به استفاده از چنین تعداد زیادی کاراکتر در رمزگذاری نداشتند، اما زمانی که از UTF-32 استفاده شد، وزن اسناد متنی را چهار برابر افزایش دادند. در نتیجه، حجم ترافیک اینترنت و حجم داده های ذخیره شده افزایش می یابد. این مقدار زیادی است و هیچ کس نمی تواند چنین ضایعاتی را بپردازد. در نتیجه توسعه یونیکد، UTF-16، که آنقدر موفق بود که به طور پیش فرض به عنوان فضای پایه برای همه نمادهایی که استفاده می کنیم پذیرفته شد. از دو بایت برای رمزگذاری یک کاراکتر استفاده می کند. بیایید ببینیم این مورد چگونه به نظر می رسد. در سیستم عامل ویندوز می توانید مسیر "شروع" - "برنامه ها" - "لوازم جانبی" - "ابزارهای سیستم" - "نقشه نماد" را دنبال کنید. در نتیجه جدولی با فرم های برداری از تمام فونت های نصب شده در سیستم شما باز می شود. اگر مجموعه کاراکتر یونیکد را در "پارامترهای اضافی" انتخاب کنید، می توانید برای هر فونت به طور جداگانه کل مجموعه کاراکترهای موجود در آن را ببینید. ضمناً با کلیک بر روی هر یک از آنها می توانید دو بایت آن را مشاهده کنید کد UTF-16متشکل از چهار رقم هگزادسیمال:![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/eb4be3.png)
Krakozyabry به جای حروف روسی - چگونه آن را تعمیر کنیم
حال ببینیم چگونه krakozyabras به جای متن ظاهر می شود یا به عبارت دیگر چگونه رمزگذاری صحیح برای متن روسی انتخاب می شود. در واقع، در برنامه ای تنظیم می شود که در آن شما همین متن یا کد را با استفاده از قطعات متن ایجاد یا ویرایش می کنید. برای ویرایش و ایجاد فایل های متنی، من شخصا از یک ویرایشگر Html و PHP ++ Notepad بسیار خوب به نظر خودم استفاده می کنم. با این حال، می تواند سینتکس صد زبان برنامه نویسی و نشانه گذاری دیگر را برجسته کند و همچنین توانایی گسترش با استفاده از افزونه ها را دارد. بررسی دقیق این برنامه عالی را در لینک ارائه شده بخوانید. در منوی بالای Notepad ++ یک مورد "Encodings" وجود دارد که در آن می توانید نسخه موجود را به نسخه ای که به طور پیش فرض در سایت خود استفاده می شود تبدیل کنید:![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/f7e151.png)
یونیکد یک دنیای بسیار بزرگ و پیچیده است، زیرا استاندارد به شما اجازه می دهد تا با تمام اسکریپت های اصلی جهان در یک رایانه کار کنید. برخی از سیستم های نوشتاری بیش از هزار سال است که وجود داشته اند و بسیاری از آنها تقریباً مستقل از یکدیگر در نقاط مختلف جهان تکامل یافته اند. مردم چیزهای زیادی اختراع کردند و اغلب آنقدر با یکدیگر متفاوت هستند که ترکیب همه اینها در یک استاندارد واحد کاری بسیار دشوار و جاه طلبانه بود.
برای درک واقعی یونیکد، باید حداقل به صورت سطحی ویژگی های تمام اسکریپت هایی را که استاندارد به شما اجازه کار با آنها را می دهد تصور کنید. اما آیا واقعا برای هر توسعه دهنده ای لازم است؟ خواهیم گفت نه. برای استفاده از یونیکد در اکثر کارهای روزمره، کافی است حداقل اطلاعات معقولی را بدانیم و سپس در صورت نیاز به بررسی استاندارد بپردازیم.
در این مقاله، ما در مورد اصول اولیه یونیکد صحبت خواهیم کرد و آن مسائل مهم کاربردی را که مطمئناً توسعه دهندگان در کار روزانه خود با آن مواجه خواهند شد، برجسته خواهیم کرد.
چرا به یونیکد نیاز داشتید؟
قبل از ظهور یونیکد، رمزگذاری های تک بایت تقریباً به طور جهانی مورد استفاده قرار می گرفتند، که در آن مرز بین خود شخصیت ها، نمایش آنها در حافظه کامپیوتر و نمایش روی صفحه نمایش نسبتاً دلخواه بود. اگر با یک یا زبان ملی دیگر کار می کردید، فونت ها-رمزگذاری های مربوطه روی سیستم شما نصب می شد که باعث می شد بایت ها را از روی دیسک روی صفحه بکشید به گونه ای که برای کاربر معنا پیدا کند.
اگر یک فایل متنی را روی چاپگر چاپ کردید و مجموعهای از کراکوزیابراهای نامفهوم را روی یک صفحه کاغذ دیدید، به این معنی است که فونتهای مربوطه در دستگاه چاپ بارگذاری نشدهاند و بایتها را به روشی متفاوت از آنچه شما میخواهید تفسیر میکند.
این رویکرد به طور کلی و رمزگذاری های تک بایتی به طور خاص دارای تعدادی اشکال مهم است:
- تنها با 256 کاراکتر می شد به طور همزمان کار کرد و 128 کاراکتر اول برای کاراکترهای لاتین و کنترل در نظر گرفته شده بود و در نیمه دوم علاوه بر کاراکترهای الفبای ملی، لازم بود جایی برای شبه گرافیک نیز پیدا شود. کاراکترها (╔ ╗).
- فونت ها به یک رمزگذاری خاص گره خورده بودند.
- هر کدگذاری مجموعهای از کاراکترها را نشان میداد و تبدیل از یکی به دیگری تنها با از دست دادن جزئی امکانپذیر بود، زمانی که کاراکترهای گمشده با نویسههای گرافیکی مشابه جایگزین شدند.
- انتقال فایل ها بین دستگاه های دارای سیستم عامل های مختلف مشکل بود. لازم بود یا یک برنامه مبدل داشته باشیم یا فونت های اضافی را به همراه فایل حمل کنیم. وجود اینترنت همانطور که می دانیم غیرممکن بود.
- سیستم های نوشتاری غیرالفبایی در دنیا وجود دارد (نوشتن هیروگلیف) که در کدگذاری تک بایتی اصولاً قابل نمایش نیستند.
اصول اولیه یونیکد
همه ما به خوبی درک می کنیم که کامپیوتر هیچ موجودیت ایده آلی را نمی شناسد، اما با بیت ها و بایت ها کار می کند. اما سیستمهای کامپیوتری هنوز توسط افراد ساخته میشوند، نه ماشینها، و گاهی اوقات برای من و شما راحتتر است که با مفاهیم نظری کار کنیم و سپس از انتزاع به عینیت حرکت کنیم.
مهم!یکی از اصول اصلی در فلسفه یونیکد، تمایز واضح بین کاراکترها، نمایش آنها در رایانه و نمایش آنها در دستگاه خروجی است.
مفهوم یک کاراکتر یونیکد انتزاعی معرفی شده است که منحصراً در قالب یک مفهوم گمانه زنی و توافق بین افراد وجود دارد که در استاندارد گنجانده شده است. هر کاراکتر یونیکد با یک عدد صحیح غیر منفی به نام نقطه کد آن مرتبط است.
بنابراین، برای مثال، کاراکتر یونیکد U + 041F یک حرف سیریلیک بزرگ P است. راههای مختلفی برای نمایش این کاراکتر در حافظه رایانه وجود دارد، درست مانند چندین هزار روش برای نمایش آن در صفحه نمایشگر. اما در همان زمان P، در آفریقا نیز P یا U + 041F خواهد بود.
این کپسوله سازی آشنا یا جداسازی رابط از پیاده سازی است، مفهومی که در برنامه نویسی به خوبی کار کرده است.
به نظر می رسد که با هدایت استاندارد، هر متنی را می توان به عنوان دنباله ای از کاراکترهای یونیکد کدگذاری کرد.
سلام U + 041F U + 0440 U + 0438 U + 0432 U + 0435 U + 0442
آن را روی یک تکه کاغذ یادداشت کنید، آن را در یک پاکت بسته بندی کنید و به هر نقطه از جهان بفرستید. اگر آنها از وجود یونیکد اطلاع داشته باشند، متن توسط آنها دقیقاً به همان شکلی که من و شما درک می کنیم. آنها کوچکترین شکی نخواهند داشت که کاراکتر ماقبل آخر دقیقاً حروف کوچک سیریلیک است ه(U + 0435) کوچک لاتین را نگویید ه(U + 0065). توجه داشته باشید که ما یک کلمه در مورد نمایش بایت نگفته ایم.
فضای کد یونیکد
فضای کد یونیکد شامل 1 114 112 نقطه کد است که از 0 تا 10FFFF متغیر است. از این تعداد تنها 128237 عدد برای نسخه نهم استاندارد تعیین شده است.بخشی از فضا برای استفاده خصوصی محفوظ است و کنسرسیوم یونیکد قول داده است که هرگز به موقعیتهایی از این مناطق خاص مقادیری اختصاص نخواهد داد.
به منظور راحتی، کل فضا به 17 هواپیما تقسیم شده است (اکنون شش مورد از آنها درگیر هستند). تا همین اواخر، مرسوم بود که بگوییم به احتمال زیاد فقط باید با Basic Multilingual Plane (BMP) روبرو شوید که شامل کاراکترهای Unicode از U + 0000 تا U + FFFF است. (با نگاهی به آینده: کاراکترهای BMP در UTF-16 در دو بایت نشان داده می شوند، نه چهار بایت). در سال 2016، این پایان نامه در حال حاضر مورد تردید است. بنابراین، برای مثال، کاراکترهای Emoji محبوب ممکن است در یک پیام کاربر پیدا شوند و شما باید بتوانید آنها را به درستی پردازش کنید.
رمزگذاری ها
اگر می خواهیم متنی را از طریق اینترنت ارسال کنیم، باید دنباله ای از کاراکترهای یونیکد را به صورت دنباله ای از بایت ها رمزگذاری کنیم.
استاندارد یونیکد شامل تعدادی رمزگذاری یونیکد مانند UTF-8 و UTF-16BE / UTF-16LE است که اجازه می دهد کل فضای نقطه کد کدگذاری شود. تبدیل بین این رمزگذاری ها می تواند آزادانه و بدون از دست دادن اطلاعات انجام شود.
همچنین، هیچکس رمزگذاریهای تکبایتی را لغو نکرده است، اما به شما امکان میدهند تا بخش منحصر به فرد و بسیار باریک خود را از طیف یونیکد - 256 نقطه کد یا کمتر - رمزگذاری کنید. برای چنین رمزگذاریهایی، جداول وجود دارند و در دسترس همه هستند، جایی که هر مقدار از یک بایت با یک کاراکتر یونیکد مرتبط است (برای مثال، CP1251.TXT را ببینید). علیرغم محدودیتها، رمزگذاریهای تک بایتی هنگام کار با مجموعهای از اطلاعات متنی تک زبانه بسیار کاربردی هستند.
UTF-8 پرکاربردترین رمزگذاری یونیکد در اینترنت است (در سال 2008 برنده جایزه شد)، عمدتاً به دلیل صرفه جویی و سازگاری شفاف با ASCII هفت بیتی. کاراکترهای لاتین و خدمات، علائم نقطه گذاری و اعداد اصلی - یعنی. همه کاراکترهای ASCII هفت بیتی در UTF-8 در یک بایت کدگذاری می شوند، مانند ASCII. شخصیت های بسیاری از اسکریپت های اصلی، به غیر از برخی از شخصیت های هیروگلیف کمیاب، در آن با دو یا سه بایت نمایش داده می شوند. بزرگترین نقطه کد تعریف شده توسط استاندارد، 10FFFF، در چهار بایت کدگذاری شده است.
توجه داشته باشید که UTF-8 یک رمزگذاری با طول متغیر است. هر کاراکتر یونیکد در آن با دنباله ای از کوانتوم های کد با حداقل طول یک کوانتوم نشان داده می شود. عدد 8 به معنای طول بیت واحد کد - 8 بیت است. برای کدگذاری های خانواده UTF-16، اندازه کوانتوم کد به ترتیب 16 بیت است. برای UTF-32 - 32 بیت.
اگر یک صفحه HTML با متن سیریلیک از طریق شبکه ارسال می کنید، UTF-8 می تواند مزایای بسیار ملموسی را به همراه داشته باشد، زیرا تمام نشانه گذاری ها و همچنین بلوک های جاوا اسکریپت و CSS به طور موثر در یک بایت کدگذاری می شوند. به عنوان مثال، صفحه اصلی Habr در UTF-8 139Kb است و در UTF-16 در حال حاضر 256Kb است. برای مقایسه، اگر از win-1251 با از دست دادن توانایی ذخیره برخی از کاراکترها استفاده کنید، اندازه آن تنها 11 کیلوبایت کاهش می یابد.
برای ذخیره اطلاعات رشته ها در برنامه ها، اغلب از رمزگذاری های یونیکد 16 بیتی به دلیل سادگی و همچنین به دلیل اینکه کاراکترهای سیستم های نوشتاری اصلی جهان در یک کوانتوم شانزده بیتی کدگذاری شده اند، استفاده می شود. بنابراین، برای مثال، جاوا با موفقیت از UTF-16 برای نمایش داخلی رشته ها استفاده می کند. سیستم عامل ویندوز نیز به صورت داخلی از UTF-16 استفاده می کند.
در هر صورت، تا زمانی که در فضای یونیکد بمانیم، واقعاً مهم نیست که اطلاعات رشته ای در یک برنامه واحد چگونه ذخیره می شود. اگر فرمت حافظه داخلی به شما امکان می دهد بیش از یک میلیون نقطه کد را به درستی رمزگذاری کنید و اطلاعاتی در مرز برنامه از دست نرود، به عنوان مثال، هنگام خواندن از یک فایل یا کپی کردن در کلیپ بورد، پس همه چیز خوب است.
برای تفسیر صحیح متن خوانده شده از دیسک یا سوکت شبکه، ابتدا باید رمزگذاری آن را تعیین کنید. این کار یا با استفاده از متا اطلاعات ارائه شده توسط کاربر نوشته شده در متن یا نزدیک آن انجام می شود، یا به صورت اکتشافی تعیین می شود.
در باقی مانده خشک
اطلاعات زیادی وجود دارد و منطقی است که خلاصه ای از همه آنچه در بالا نوشته شده است ارائه شود:
- یونیکد تمایز واضحی را بین کاراکترها، نمایش آنها در رایانه و نمایش آنها در دستگاه خروجی فرض می کند.
- فضای کد یونیکد شامل 1 114 112 نقطه کد است که از 0 تا 10FFFF متغیر است.
- صفحه چند زبانه پایه شامل کاراکترهای یونیکد U + 0000 تا U + FFFF است که در UTF-16 در دو بایت کدگذاری می شوند.
- هر کدگذاری یونیکد به شما امکان می دهد کل فضای نقاط کد یونیکد را رمزگذاری کنید و تبدیل بین این کدگذاری های مختلف بدون از دست دادن اطلاعات انجام می شود.
- رمزگذاری های تک بایتی می توانند تنها بخش کوچکی از طیف یونیکد را رمزگذاری کنند، اما می توانند هنگام کار با حجم زیادی از اطلاعات تک زبانه مفید باشند.
- کدهای UTF-8 و UTF-16 دارای طول کد متغیر هستند. در UTF-8، هر کاراکتر یونیکد را می توان با یک، دو، سه یا چهار بایت کدگذاری کرد. در UTF-16، دو یا چهار بایت.
- قالب داخلی ذخیره سازی اطلاعات متنی در یک برنامه جداگانه می تواند دلخواه باشد، مشروط بر اینکه با کل فضای کد یونیکد به درستی کار کند و در انتقال داده های بین مرزی ضرری نداشته باشد.
نکته ای سریع در مورد کدنویسی
ممکن است برخی از سردرگمی ها با اصطلاح رمزگذاری رخ دهد. در یونیکد، رمزگذاری دو بار اتفاق می افتد. اولین باری که یک مجموعه کاراکتر کدگذاری می شود، به این معنا که به هر کاراکتر یونیکد یک نقطه کد مربوطه اختصاص داده می شود. این فرآیند مجموعه کاراکترهای یونیکد را به مجموعه کاراکترهای کدگذاری شده تبدیل می کند. بار دوم که دنباله ای از کاراکترهای یونیکد به یک رشته بایت تبدیل می شود، این فرآیند رمزگذاری نیز نامیده می شود.
در اصطلاح انگلیسی، دو فعل مختلف برای کدگذاری و رمزگذاری وجود دارد، اما حتی افراد بومی اغلب در مورد آنها اشتباه می گیرند. علاوه بر این، عبارت مجموعه کاراکتر یا مجموعه نویسه مترادف با عبارت مجموعه کاراکتر کد شده استفاده می شود.
همه اینها را به این واقعیت می گوییم که وقتی صحبت از موقعیت کد یک کاراکتر یونیکد انتزاعی و زمانی که به نمایش بایت آن می رسد، توجه به زمینه و تشخیص موقعیت ها منطقی است.
سرانجام
جنبه های مختلف یونیکد بسیار زیاد است که نمی توان همه چیز را در یک مقاله پوشش داد. و غیر ضروری. اطلاعات فوق برای جلوگیری از سردرگمی در اصول اولیه و کار با متن در اکثر کارهای روزمره کافی است (بخوانید: بدون فراتر از BMP). در مقالات بعدی در مورد عادی سازی صحبت خواهیم کرد، مروری تاریخی کامل تر از توسعه رمزگذاری ها ارائه خواهیم داد، در مورد مشکلات اصطلاحات یونیکد به زبان روسی صحبت خواهیم کرد، و همچنین مطالبی در مورد جنبه های عملی استفاده از UTF-8 و UTF-16 ارائه خواهیم کرد. .
یونیکد: UTF-8، UTF-16، UTF-32.
یونیکد مجموعه ای از کاراکترهای گرافیکی و روشی برای رمزگذاری آنها برای پردازش کامپیوتری داده های متنی است.
یونیکد نه تنها یک کد منحصر به فرد به هر کاراکتر اختصاص می دهد، بلکه ویژگی های مختلفی از آن کاراکتر را نیز تعریف می کند، به عنوان مثال:
نوع کاراکتر (حرف بزرگ، حرف کوچک، عدد، علامت نقطه گذاری و غیره)؛
ویژگی های کاراکتر (نمایش از چپ به راست یا راست به چپ، فاصله، شکست خط و غیره)؛
حروف بزرگ یا کوچک مربوطه (به ترتیب برای حروف کوچک و بزرگ)؛
مقدار عددی مربوطه (برای کاراکترهای عددی).
استانداردها UTF(مخفف Unicode Transformation Format) برای نشان دادن کاراکترها:
UTF-16: بهینه سازی ویندوز، افزایش سرعت، پرسش های متداول ویستا از رمزگذاری UTF-16 برای نمایش تمام کاراکترهای یونیکد استفاده می کند. در UTF-16، کاراکترها با دو بایت (16 بیت) نشان داده می شوند. این رمزگذاری در ویندوز استفاده می شود زیرا مقادیر 16 بیتی می توانند کاراکترهایی را نشان دهند که الفبای اکثر زبان های جهان را تشکیل می دهند، این به برنامه ها اجازه می دهد تا رشته ها را پردازش کرده و طول آنها را سریعتر محاسبه کنند. با این حال، 16 بیت برای نشان دادن حروف الفبا در برخی از زبان ها کافی نیست. برای چنین مواردی، UTE-16 از رمزگذاری های "جانشین" پشتیبانی می کند و به کاراکترها اجازه می دهد در 32 بیت (4 بایت) کدگذاری شوند. با این حال، برنامههای کاربردی کمی وجود دارند که باید با کاراکترهای چنین زبانهایی سروکار داشته باشند، بنابراین UTF-16 یک سازش خوب بین صرفهجویی در حافظه و سهولت برنامهنویسی است. توجه داشته باشید که .NET Framework همه کاراکترها را با استفاده از UTF-16 رمزگذاری می کند، بنابراین استفاده از UTF-16 در برنامه های ویندوز عملکرد را بهبود می بخشد و مصرف حافظه را هنگام ارسال رشته ها بین کدهای بومی و مدیریت شده کاهش می دهد.
UTF-8: در رمزگذاری UTF-8، کاراکترهای مختلف را می توان با 1،2،3 یا 4 بایت نشان داد. کاراکترهای با مقادیر کمتر از 0x0080 به 1 بایت فشرده می شوند که برای کاراکترهای آمریکایی بسیار راحت است. کاراکترهایی که با مقادیر در محدوده 0x0080-0x07FF مطابقت دارند به مقادیر 2 بایتی تبدیل می شوند که با الفبای اروپایی و خاورمیانه به خوبی کار می کند. کاراکترهایی با مقادیر بزرگتر به مقادیر 3 بایتی تبدیل می شوند که برای کار با زبان های آسیای مرکزی مفید است. در نهایت جفت های جایگزین در قالب 4 بایت نوشته می شوند. UTF-8 یک رمزگذاری بسیار محبوب است. با این حال، اگر اغلب از کاراکترهایی با مقادیر 0x0800 و بالاتر استفاده شود، نسبت به UTF-16 مؤثر است.
UTF-32: در UTF-32 همه کاراکترها با 4 بایت نمایش داده می شوند. این رمزگذاری برای نوشتن الگوریتمهای ساده برای شمارش کاراکترها در هر زبانی که نیازی به پردازش کاراکترهایی که با تعداد متفاوتی از بایتها نمایش داده میشوند، راحت است. به عنوان مثال، هنگام استفاده از UTF-32، می توانید "جانشین ها" را فراموش کنید، زیرا هر کاراکتر در این رمزگذاری با 4 بایت نمایش داده می شود. واضح است که از نقطه نظر استفاده از حافظه، کارایی UTF-32 با ایده آل فاصله زیادی دارد. بنابراین، این رمزگذاری به ندرت برای انتقال رشته ها در شبکه و ذخیره آنها در فایل ها استفاده می شود. به طور معمول، UTF-32 به عنوان یک قالب داخلی برای ارائه داده ها در یک برنامه استفاده می شود.
UTF-8
در آینده نزدیک، فرمت یونیکد (و ISO 10646) ویژه ای به نام UTF-8... این رمزگذاری «مشتقشده» از رشتههای بایت با طولهای مختلف (از یک تا شش) برای نوشتن کاراکترها استفاده میکند که با استفاده از یک الگوریتم ساده، با رشتههای کوتاهتر مربوط به کاراکترهای رایجتر، به کدهای یونیکد تبدیل میشوند. مزیت اصلی این فرمت سازگاری با ASCII نه تنها در مقادیر کدها، بلکه در تعداد بیت در هر کاراکتر است، زیرا یک بایت برای رمزگذاری هر یک از 128 کاراکتر اول در UTF-8 کافی است (اگرچه به عنوان مثال، برای حروف سیریلیک، دو بایت).
فرمت UTF-8 در 2 سپتامبر 1992 توسط کن تامپسون و راب پایک اختراع شد و در طرح 9 پیاده سازی شد. استاندارد UTF-8 اکنون در RFC 3629 و ISO / IEC 10646 Annex D رسمیت یافته است.
برای یک طراح وب، این رمزگذاری از اهمیت ویژه ای برخوردار است، زیرا از نسخه 4 به عنوان "رمزگذاری سند استاندارد" در HTML اعلام شده است.
زمانی که در UTF-8 نوشته شود، متنی که فقط شامل کاراکترهایی با شماره کمتر از 128 باشد، به متن ASCII ساده تبدیل میشود. برعکس، در متن UTF-8، هر بایتی با مقدار کمتر از 128 نشان دهنده یک کاراکتر ASCII با همان کد است. بقیه کاراکترهای یونیکد با دنباله هایی از 2 تا 6 بایت نمایش داده می شوند (در واقع فقط حداکثر تا 4 بایت، زیرا استفاده از کدهای بزرگتر از 221 برنامه ریزی نشده است)، که در آن اولین بایت همیشه شبیه 11xxxxxx است و بقیه بایت ها به نظر می رسد. - 10xxxxxx.
به زبان ساده، در فرمت UTF-8، کاراکترهای لاتین، علائم نگارشی و کاراکترهای کنترلی ASCII در کدهای US-ASCII نوشته میشوند و همه کاراکترهای دیگر با استفاده از چندین اکتت با مهمترین بیت 1 کدگذاری میشوند. این دو اثر دارد.
حتی اگر برنامه یونیکد را تشخیص ندهد، حروف لاتین، اعداد عربی و علائم نگارشی به درستی نمایش داده می شوند.
اگر حروف لاتین و علائم نگارشی ساده (از جمله فضا) مقدار قابل توجهی از متن را اشغال کنند، UTF-8 در مقایسه با UTF-16 افزایش حجم می دهد.
در نگاه اول، ممکن است به نظر برسد که UTF-16 راحت تر است، زیرا بیشتر کاراکترها دقیقاً در دو بایت کدگذاری می شوند. با این حال، این نیاز با نیاز به پشتیبانی از جفتهای جایگزین، که اغلب هنگام استفاده از UTF-16 نادیده گرفته میشوند و فقط از کاراکترهای UCS-2 پشتیبانی میکنند، نفی میشود.
این استاندارد در سال 1991 توسط کنسرسیوم یونیکد، شرکت یونیکد، یک سازمان غیرانتفاعی پیشنهاد شد. استفاده از این استاندارد امکان رمزگذاری تعداد بسیار زیادی کاراکتر از اسکریپت های مختلف را فراهم می کند: در اسناد یونیکد، حروف چینی، حروف ریاضی، حروف الفبای یونانی، الفبای لاتین و سیریلیک می توانند همزیستی داشته باشند، بنابراین تعویض صفحات کد غیرضروری می شود.
این استاندارد از دو بخش اصلی تشکیل شده است: مجموعه کاراکترهای جهانی (UCS) و فرمت تبدیل یونیکد (UTF). مجموعه کاراکترهای جهانی مطابقت یک به یک کاراکترها با کدها را تعریف می کند - عناصر فضای کد که اعداد صحیح غیر منفی را نشان می دهند. خانواده کدگذاری ها نمایش ماشین دنباله ای از کدهای UCS را تعریف می کند.
استاندارد یونیکد با هدف ایجاد یک رمزگذاری کاراکتر یکنواخت برای همه زبانهای نوشتاری مدرن و باستانی ایجاد شد. هر کاراکتر در این استاندارد در 16 بیت کدگذاری شده است که به آن امکان می دهد تعداد غیرقابل مقایسه ای از کاراکترها را نسبت به رمزگذاری های 8 بیتی پذیرفته شده قبلی پوشش دهد. تفاوت مهم دیگر بین یونیکد و سایر سیستم های رمزگذاری این است که نه تنها یک کد منحصر به فرد به هر کاراکتر اختصاص می دهد، بلکه ویژگی های مختلفی را برای این کاراکتر تعریف می کند، به عنوان مثال:
نوع کاراکتر (حرف بزرگ، حرف کوچک، عدد، علامت نقطه گذاری و غیره)؛
ویژگی های کاراکتر (نمایش از چپ به راست یا راست به چپ، فاصله، شکست خط و غیره)؛
حروف بزرگ یا کوچک مربوطه (به ترتیب برای حروف کوچک و بزرگ)؛
مقدار عددی مربوطه (برای کاراکترهای عددی).
کل محدوده کدها از 0 تا FFFF به چندین زیرمجموعه استاندارد تقسیم می شود که هر کدام مربوط به الفبای یک زبان خاص یا گروهی از کاراکترهای خاص است که از نظر عملکرد مشابه هستند. نمودار زیر فهرستی کلی از زیرمجموعه های Unicode 3.0 را ارائه می دهد (شکل 2).
تصویر 2
استاندارد یونیکد اساس ذخیره سازی و متن در بسیاری از سیستم های کامپیوتری مدرن است. با این حال، با اکثر پروتکلهای اینترنتی سازگار نیست، زیرا کدهای آن میتوانند حاوی هر مقدار بایت باشند و پروتکلها معمولاً از بایتهای 00 - 1F و FE - FF به عنوان سربار استفاده میکنند. برای دستیابی به قابلیت همکاری، چندین فرمت تبدیل یونیکد (UTFs، Unicode Transformation Formats) ایجاد شده است که امروزه UTF-8 رایج ترین آنهاست. این فرمت قوانین زیر را برای تبدیل هر کد یونیکد به مجموعه ای از بایت (یک تا سه) مناسب برای انتقال توسط پروتکل های اینترنتی تعریف می کند.
در اینجا x، y، z بیتهایی از کد منبع را نشان میدهند که باید استخراج شوند، با کمترین اهمیت شروع شوند، و تا زمانی که تمام موقعیتهای مشخص شده پر شوند، در بایتهای نتیجه از راست به چپ وارد شوند.
توسعه بیشتر استاندارد یونیکد با افزودن سطوح زبانی جدید همراه است. کاراکترهایی در محدوده 10000 - 1FFFF، 20000 - 2FFFF، و غیره، که در آن قرار است رمزگذاری برای اسکریپت های زبان های مرده که در جدول بالا گنجانده نشده اند را شامل شود. یک قالب جدید UTF-16 برای رمزگذاری این کاراکترهای اضافی ایجاد شد.
بنابراین، 4 روش اصلی برای رمزگذاری بایت های یونیکد وجود دارد:
UTF-8: 128 کاراکتر در یک بایت (فرمت ASCII)، 1920 کاراکتر در 2 بایت ((رومی، یونانی، سیریلیک، قبطی، ارمنی، عبری، عربی نویسهها)، 63488 کاراکتر در 3 بایت (چینی) کدگذاری میشوند. , ژاپنی و دیگران
UCS-2: هر کاراکتر با 2 بایت نمایش داده می شود. این رمزگذاری فقط شامل 65535 کاراکتر اول از قالب یونیکد است.
UTF-16: این یک پسوند UCS-2 است و شامل 1 114 112 کاراکتر یونیکد است. 65535 کاراکتر اول با 2 بایت و بقیه با 4 بایت نمایش داده می شوند.
USC-4: هر کاراکتر در 4 بایت کدگذاری می شود.