نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی پرتال اطلاعاتی
  • خانه
  • ویندوز فون
  • چند کاراکتر در جدول یونیکد وجود دارد. یونیکد در وب: مقدمه ای برای مبتدیان

چند کاراکتر در جدول یونیکد وجود دارد. یونیکد در وب: مقدمه ای برای مبتدیان

یونیکد یا یونیکد (از کلمه انگلیسی یونیکد) یک استاندارد رمزگذاری کاراکتر کاراکتر است. تقریباً تمام زبان های نوشتاری را قادر می سازد تا رمزگذاری شوند.

در اواخر دهه 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 شامل برخی از نمادهای خدماتی مانند براکت، خطوط هش، ستاره و غیره است. در واقع، شما خودتان می توانید آنها را ببینید:
این 128 کاراکتر از نسخه اصلی ASCII هستند که به استاندارد تبدیل شدند و در هر کدگذاری دیگری مطمئناً آنها را ملاقات خواهید کرد و آنها به ترتیب قرار خواهند گرفت. اما واقعیت این است که با کمک یک بایت اطلاعات، می توان نه 128، بلکه 256 مقدار مختلف (دو به توان هشت برابر با 256) را رمزگذاری کرد، بنابراین، پس از نسخه پایه Asuka. ، یک سری کامل ظاهر شد رمزگذاری های ASCII توسعه یافته، که در آن علاوه بر 128 کاراکتر اصلی، امکان رمزگذاری نمادهای رمزگذاری ملی (مثلاً روسی) وجود داشت. در اینجا، شاید ارزش داشته باشد که در مورد سیستم های اعدادی که در توضیحات استفاده می شود، کمی بیشتر صحبت کنیم. در مرحله اول، همانطور که همه شما می دانید، کامپیوتر فقط با اعداد در سیستم دودویی کار می کند، یعنی با صفر و یک ("جبر بولی"، اگر کسی به کالج یا مدرسه رفته باشد). یک بایت از هشت بیت تشکیل شده است که هر کدام از آنها دو به توان است که از صفر شروع می شود و در بیت هفتم تا دو بیت می رسد:
درک اینکه تنها 256 ترکیب ممکن از صفر و یک در چنین ساختاری وجود دارد دشوار نیست. تبدیل یک عدد از یک سیستم باینری به یک اعشاری بسیار ساده است. شما فقط باید تمام قدرت های دو را که بالاتر از آنها وجود دارد جمع کنید. در مثال ما، این 1 (2 به توان صفر) به اضافه 8 (دو به توان 3)، به اضافه 32 (دو به توان پنجم)، به اضافه 64 (به توان ششم)، به اضافه 128 (به توان هفتم) است. مجموع در نماد اعشاری 233 می شود. همانطور که می بینید، همه چیز بسیار ساده است. اما اگر به جدول با کاراکترهای ASCII دقت کنید، خواهید دید که آنها در کدگذاری هگزادسیمال نشان داده شده اند. به عنوان مثال، یک ستاره با عدد هگزادسیمال 2A در آسوکا مطابقت دارد. حتما می دانید که در سیستم اعداد هگزادسیمال علاوه بر اعداد عربی از حروف لاتین از A (به معنی ده) تا F (به معنی پانزده) نیز استفاده می شود. خوب، برای تبدیل عدد باینری به هگزادسیمالبه روش ساده و شهودی زیر متوسل شوید. همانطور که در تصویر بالا نشان داده شده است، هر بایت اطلاعات به دو قسمت چهار بیتی تقسیم می شود. که در هر نیم بایت، فقط شانزده مقدار (دو تا توان چهارم) را می توان به صورت باینری کدگذاری کرد که به راحتی می توان آن را به عنوان یک عدد هگزا دسیمال نشان داد. علاوه بر این، در نیمه سمت چپ بایت، لازم است که درجه ها را دوباره از صفر شروع کنید، نه همانطور که در تصویر نشان داده شده است. در نتیجه، با برخی از محاسبات ساده، دریافتیم که عدد E9 در تصویر کدگذاری شده است. امیدوارم مسیر استدلال من و راه حل این معما برای شما روشن شده باشد. خب، حالا بیایید ادامه دهیم، در واقع، در مورد رمزگذاری متن صحبت می کنیم.

نسخه های توسعه یافته Asuka - رمزگذاری CP866 و KOI8-R با شبه نگاری

بنابراین، ما شروع به صحبت در مورد ASCII کردیم، که، همانطور که بود، نقطه شروعی برای توسعه همه رمزگذاری های مدرن (ویندوز 1251، یونیکد، UTF 8) بود. در ابتدا فقط شامل 128 کاراکتر از الفبای لاتین، اعداد عربی و چیزهای دیگر در آنجا بود، اما در نسخه توسعه یافته امکان استفاده از تمام 256 مقداری که می توانند در یک بایت اطلاعات رمزگذاری شوند، وجود داشت. آن ها اضافه کردن نمادهایی از حروف زبان خود به Aski امکان پذیر شد. در اینجا لازم است برای روشن شدن یک بار دیگر انحراف داشته باشیم - چرا اصلاً به رمزگذاری متن نیاز داریمو چرا اینقدر مهم است. نمادها بر روی صفحه نمایش رایانه شما بر اساس دو چیز تشکیل می شوند - مجموعه ای از اشکال برداری (نمایش) از انواع کاراکترها (آنها در فایل هایی با فونت هایی هستند که روی رایانه شما نصب شده اند) و کدی که به شما امکان می دهد دقیقاً همان یکی از این مجموعه اشکال برداری (فایل فونت) کاراکتری را که باید در محل مورد نظر درج شود، بیرون بکشید. واضح است که خود فونت ها مسئول فرم های برداری هستند، اما سیستم عامل و برنامه های استفاده شده در آن وظیفه کدنویسی را بر عهده دارند. آن ها هر متنی در رایانه شما مجموعه ای از بایت ها خواهد بود که هر کدام یک کاراکتر از همین متن را رمزگذاری می کند. برنامه ای که این متن را روی صفحه نمایش می دهد (ویرایشگر متن، مرورگر و غیره)، هنگام تجزیه کد، رمزگذاری کاراکتر بعدی را می خواند و در فایل فونت مورد نیاز به دنبال فرم برداری مربوطه می گردد که برای نمایش این وصل است. سند متنی همه چیز ساده و پیش پا افتاده است. این بدان معناست که برای رمزگذاری هر کاراکتری که نیاز داریم (مثلاً از الفبای ملی)، دو شرط باید رعایت شود - شکل برداری این کاراکتر باید با فونت استفاده شده باشد و این کاراکتر می تواند در رمزگذاری های ASCII توسعه یافته در کدگذاری شود. یک بایت بنابراین، یک دسته کامل از این گزینه ها وجود دارد. انواع مختلفی از Asuka توسعه یافته فقط برای رمزگذاری کاراکترهای زبان روسی وجود دارد. به عنوان مثال، در ابتدا ظاهر شد CP866، که در آن امکان استفاده از حروف الفبای روسی وجود داشت و نسخه توسعه یافته ASCII بود. آن ها قسمت بالای آن کاملاً با نسخه اصلی Asuka (128 کاراکتر لاتین، اعداد و هر چیز مزخرفی) مطابقت داشت که در تصویر بالا نشان داده شده است، اما قسمت پایین جدول با رمزگذاری CP866 نمای نشان داده شده در تصویر را داشت. در زیر و مجاز به رمزگذاری 128 علامت دیگر (حروف روسی و انواع شبه گرافیک):
ببینید، در ستون سمت راست، اعداد با 8 شروع می شوند، زیرا اعداد 0 تا 7 به بخش اصلی ASCII اشاره دارند (نگاه کنید به تصویر اول). که حرف روسی "M" در CP866 دارای کد 9C خواهد بود (در تقاطع خط مربوطه با 9 و ستون با عدد C در نماد هگزادسیمال قرار دارد)، که می تواند در یک بایت اطلاعات نوشته شود، و اگر یک فونت مناسب با حروف روسی وجود دارد، این حرف بدون مشکل در متن نمایش داده می شود. این مبلغ از کجا آمده است؟ شبه نگاری در CP866? نکته این است که این رمزگذاری برای متن روسی در آن سال های خزدار توسعه یافته است، زمانی که چنین گسترش سیستم عامل های گرافیکی مانند اکنون وجود نداشت. و در Dos و سیستم‌عامل‌های متنی مشابه، شبه گرافیک‌ها این امکان را به وجود می‌آورد که به نوعی طراحی متون را متنوع کنیم و بنابراین CP866 و سایر همتایان آن از دسته نسخه‌های توسعه‌یافته Asuka در آن فراوان است. CP866 توسط IBM توزیع شد، اما علاوه بر این، تعدادی رمزگذاری برای کاراکترهای روسی توسعه داده شد، به عنوان مثال، این نوع (ASCII توسعه یافته) را می توان نسبت داد. KOI8-R:
اصل عملکرد آن مانند CP866 است که کمی پیشتر توضیح داده شد - هر کاراکتر متن با یک بایت واحد کدگذاری می شود. اسکرین شات نیمه دوم جدول KOI8-R را نشان می دهد نیمه اول کاملاً با Asuka اصلی مطابقت دارد که در اولین تصویر در این مقاله نشان داده شده است. از جمله ویژگی های رمزگذاری KOI8-R می توان به این نکته اشاره کرد که حروف روسی در جدول آن به ترتیب حروف الفبا نیستند، همانطور که برای مثال در CP866 انجام دادند. اگر به اولین اسکرین شات (قسمت پایه، که در تمام رمزگذاری های توسعه یافته موجود است) نگاه کنید، متوجه خواهید شد که در KOI8-R حروف روسی در همان سلول های جدول قرار دارند که حروف همخوان الفبای لاتین قرار دارند. با آنها از قسمت اول جدول. این کار برای راحتی جابجایی از حروف روسی به نویسه‌های لاتین با کنار گذاشتن تنها یک بیت (دو تا توان هفتم یا 128) انجام شد.

ویندوز 1251 - نسخه مدرن ASCII و دلیل بیرون آمدن کراکوزیابری

توسعه بیشتر رمزگذاری متن با این واقعیت همراه بود که سیستم عامل های گرافیکی در حال افزایش محبوبیت بودند و نیاز به استفاده از شبه گرافیک در آنها با گذشت زمان ناپدید شد. در نتیجه، یک گروه کامل به وجود آمد که در اصل، هنوز نسخه های توسعه یافته Asuka بودند (یک کاراکتر متن تنها با یک بایت اطلاعات رمزگذاری شده است)، اما در حال حاضر بدون استفاده از شخصیت های شبه گرافیکی. آنها متعلق به کدهای به اصطلاح ANSI بودند که توسط مؤسسه استانداردهای آمریکایی توسعه یافتند. در اصطلاح رایج، نام الفبای سیریلیک هنوز برای نسخه با پشتیبانی از زبان روسی استفاده می شد. یک نمونه از این است ویندوز 1251... تفاوت مطلوبی با CP866 و KOI8-R که قبلاً استفاده شده بود از این جهت بود که نمادهای شبه گرافیکی در آن توسط نمادهای گمشده تایپوگرافی روسی (به جز علامت لهجه) و همچنین نمادهای مورد استفاده در زبان های اسلاوی گرفته شد. نزدیک به روسی (اوکراینی، بلاروسی و غیره) :
به دلیل انبوهی از رمزگذاری های زبان روسی، تولیدکنندگان فونت و تولیدکنندگان نرم افزار دائماً دچار سردرد می شدند و ما، خوانندگان عزیز، اغلب از آن بدنام خلاص می شدیم. کراکوزیابریزمانی که با نسخه استفاده شده در متن سردرگمی وجود داشت. اغلب آنها هنگام ارسال و دریافت پیام از طریق ایمیل خارج می شدند که مستلزم ایجاد جداول تبدیل بسیار پیچیده بود که در واقع نمی توانست اساساً این مشکل را حل کند و اغلب کاربران برای مکاتبات از نویسه گردانی حروف لاتین استفاده می کردند. هنگام استفاده از رمزگذاری‌های روسی مانند CP866، KOI8-R یا Windows 1251 از krakozyabrov بدنام اجتناب کنید. در واقع، خزیدن krakozyabry به جای متن روسی نتیجه استفاده نادرست از رمزگذاری این زبان بود که مطابقت نداشت. پیام متنی که در ابتدا در آن رمزگذاری شده بود. به عنوان مثال، اگر بخواهیم کاراکترهای کدگذاری شده با CP866 را با استفاده از جدول کد ویندوز 1251 نمایش دهیم، همان krakozyabry (مجموعه بی معنی از کاراکترها) ظاهر می شود و کاملاً جایگزین متن پیام می شود. وضعیت مشابهی اغلب هنگام ایجاد و پیکربندی سایت‌ها، انجمن‌ها یا وبلاگ‌ها رخ می‌دهد، زمانی که متن با حروف روسی به اشتباه در رمزگذاری اشتباهی که به‌طور پیش‌فرض در سایت استفاده می‌شود ذخیره می‌شود، یا در ویرایشگر متن اشتباهی که گگ نامرئی به کد اضافه می‌کند. با چشم غیر مسلح در پایان، چنین وضعیتی با انبوهی از رمزگذاری ها و کراکوزیابراهای دائماً در حال ظهور خسته از بسیاری، پیش نیازهایی برای ایجاد یک تنوع جهانی جدید وجود داشت که جایگزین همه موارد موجود شود و در نهایت مشکل ریشه ای ظاهر متون ناخوانا را حل کند. . علاوه بر این، مشکل زبان هایی مانند چینی وجود داشت که نویسه های زبان بسیار بیشتر از 256 بود.

یونیکد - رمزگذاری جهانی UTF 8، 16 و 32

این هزاران کاراکتر از گروه زبان آسیای جنوب شرقی را نمی‌توان در یک بایت اطلاعات توصیف کرد، که برای رمزگذاری کاراکترها در نسخه‌های توسعه‌یافته ASCII اختصاص داده شده است. در نتیجه کنسرسیومی به نام ایجاد شد یونیکد(یونیکد - کنسرسیوم یونیکد) با همکاری بسیاری از رهبران صنعت فناوری اطلاعات (کسانی که نرم افزار تولید می کنند، سخت افزار کدنویسی می کنند، فونت ایجاد می کنند) که علاقه مند به ظهور یک رمزگذاری متن جهانی بودند. اولین نسخه منتشر شده تحت نظارت کنسرسیوم یونیکد بود UTF 32... عدد در نام رمزگذاری به معنای تعداد بیت هایی است که برای رمزگذاری یک کاراکتر استفاده می شود. 32 بیت 4 بایت اطلاعات است که برای رمزگذاری یک کاراکتر در رمزگذاری جهانی UTF جدید مورد نیاز است. در نتیجه، همان فایل با متن کدگذاری شده در نسخه توسعه یافته ASCII و در UTF-32، در مورد دوم، اندازه (وزن) چهار برابر بیشتر خواهد داشت. این بد است، اما اکنون این فرصت را داریم که تعداد کاراکترهای برابر با دو را با توان سی و دوم رمزگذاری کنیم ( میلیاردها شخصیت، که هر مقدار واقعا ضروری را با یک حاشیه عظیم پوشش می دهد). اما بسیاری از کشورهای دارای زبان های گروه اروپایی نیازی به استفاده از چنین تعداد زیادی کاراکتر در رمزگذاری نداشتند، اما زمانی که از UTF-32 استفاده شد، وزن اسناد متنی را چهار برابر افزایش دادند. در نتیجه، حجم ترافیک اینترنت و حجم داده های ذخیره شده افزایش می یابد. این مقدار زیادی است و هیچ کس نمی تواند چنین ضایعاتی را بپردازد. در نتیجه توسعه یونیکد، UTF-16، که آنقدر موفق بود که به طور پیش فرض به عنوان فضای پایه برای همه نمادهایی که استفاده می کنیم پذیرفته شد. از دو بایت برای رمزگذاری یک کاراکتر استفاده می کند. بیایید ببینیم این مورد چگونه به نظر می رسد. در سیستم عامل ویندوز می توانید مسیر "شروع" - "برنامه ها" - "لوازم جانبی" - "ابزارهای سیستم" - "نقشه نماد" را دنبال کنید. در نتیجه جدولی با فرم های برداری از تمام فونت های نصب شده در سیستم شما باز می شود. اگر مجموعه کاراکتر یونیکد را در "پارامترهای اضافی" انتخاب کنید، می توانید برای هر فونت به طور جداگانه کل مجموعه کاراکترهای موجود در آن را ببینید. ضمناً با کلیک بر روی هر یک از آنها می توانید دو بایت آن را مشاهده کنید کد UTF-16متشکل از چهار رقم هگزادسیمال: چند کاراکتر را می توان در UTF-16 با 16 بیت کدگذاری کرد؟ 65536 (دو به توان شانزده) و این عدد بود که به عنوان فضای پایه در یونیکد در نظر گرفته شد. علاوه بر این، راه هایی برای رمزگذاری با آن و حدود دو میلیون کاراکتر وجود دارد، اما به فضای گسترده یک میلیون کاراکتر متن محدود شده بود. اما حتی این نسخه موفق رمزگذاری یونیکد رضایت زیادی را برای کسانی که مثلاً برنامه ها را فقط به زبان انگلیسی می نوشتند، به همراه نداشت، زیرا پس از انتقال از نسخه توسعه یافته ASCII به UTF-16، وزن اسناد دو برابر شد (یک بایت در هر یک کاراکتر در Aski و دو بایت برای همان کاراکتر در UTP-16). دقیقاً برای رضایت همه و همه چیز در کنسرسیوم یونیکد تصمیم گرفته شد یک رمزگذاری ایجاد کنیدطول متغیر. اسمش را گذاشتند UTF-8. با وجود عدد هشت در نام، واقعا طول متغیری دارد، یعنی. هر کاراکتر در متن را می توان به دنباله ای از یک تا شش بایت کدگذاری کرد. در عمل، در UTF-8، فقط از محدوده یک تا چهار بایت استفاده می شود، زیرا فراتر از چهار بایت کد، حتی از نظر تئوری نیز چیزی قابل تصور نیست. تمام حروف لاتین موجود در آن در یک بایت کدگذاری می شوند، درست مانند ASCII خوب قدیمی. آنچه قابل توجه است، در مورد رمزگذاری فقط الفبای لاتین، حتی برنامه هایی که یونیکد را درک نمی کنند، همچنان آنچه را که در UTF-8 رمزگذاری شده است، می خوانند. آن ها بخش اصلی Asuka به تازگی به این زاده فکری کنسرسیوم یونیکد منتقل شده است. کاراکترهای سیریلیک در UTF-8 در دو بایت و، به عنوان مثال، نویسه های گرجی - در سه بایت کدگذاری می شوند. کنسرسیوم یونیکد، پس از ایجاد UTF 16 و 8، مشکل اصلی را حل کرد - اکنون ما داریم فونت ها یک فضای کد واحد دارند... و اکنون تولید کنندگان آنها فقط می توانند آن را با فرم های برداری نمادهای متنی بر اساس نقاط قوت و قابلیت های خود پر کنند. در "جدول کاراکتر" بالا می توانید ببینید که فونت های مختلف از تعداد کاراکترهای متفاوتی پشتیبانی می کنند. برخی از فونت های غنی از یونیکد می توانند بسیار سنگین باشند. اما اکنون تفاوت آنها نه در این است که برای رمزگذاری های مختلف ایجاد شده اند، بلکه در این که سازنده فونت یک فضای کد واحد را با فرم های برداری خاص تا انتها پر کرده یا پر نکرده است.

Krakozyabry به جای حروف روسی - چگونه آن را تعمیر کنیم

حال ببینیم چگونه krakozyabras به جای متن ظاهر می شود یا به عبارت دیگر چگونه رمزگذاری صحیح برای متن روسی انتخاب می شود. در واقع، در برنامه ای تنظیم می شود که در آن شما همین متن یا کد را با استفاده از قطعات متن ایجاد یا ویرایش می کنید. برای ویرایش و ایجاد فایل های متنی، من شخصا از یک ویرایشگر Html و PHP ++ Notepad بسیار خوب به نظر خودم استفاده می کنم. با این حال، می تواند سینتکس صد زبان برنامه نویسی و نشانه گذاری دیگر را برجسته کند و همچنین توانایی گسترش با استفاده از افزونه ها را دارد. بررسی دقیق این برنامه عالی را در لینک ارائه شده بخوانید. در منوی بالای Notepad ++ یک مورد "Encodings" وجود دارد که در آن می توانید نسخه موجود را به نسخه ای که به طور پیش فرض در سایت خود استفاده می شود تبدیل کنید:
در مورد سایت جوملا 1.5 و بالاتر و همچنین در مورد وبلاگ در وردپرس برای جلوگیری از ظاهر شدن کرک گزینه را انتخاب کنید. UTF 8 بدون BOM... پیشوند BOM چیست؟ واقعیت این است که هنگامی که کدنویسی YUTF-16 توسعه یافت، به دلایلی تصمیم گرفتند چیزی مانند توانایی نوشتن یک کد کاراکتر، هم به ترتیب مستقیم (به عنوان مثال، 0A15) و هم به صورت معکوس (150A) به آن متصل کنند. . و برای اینکه برنامه ها بفهمند کدها را در کدام دنباله بخوانند و اختراع شد BOM(Byte Order Mark یا به عبارتی امضا) که در همان ابتدای اسناد با افزودن سه بایت اضافی بیان می شد. در رمزگذاری UTF-8، هیچ BOM در کنسرسیوم یونیکد پیش بینی نشده است، و بنابراین اضافه کردن یک امضا (این بدنام ترین سه بایت اضافی به ابتدای سند) به سادگی از خواندن کد برخی از برنامه ها جلوگیری می کند. بنابراین، هنگام ذخیره فایل ها در UTP، همیشه باید گزینه بدون BOM (بدون امضا) را انتخاب کنیم. بنابراین شما پیشروی می کنید خود را از خزیدن از krakozyabrov محافظت کنید... نکته قابل توجه این است که برخی از برنامه های ویندوز نمی توانند این کار را انجام دهند (نمی توانند متن را در UTP-8 بدون BOM ذخیره کنند)، به عنوان مثال، Notepad بدنام ویندوز. سند را در UTF-8 ذخیره می کند، اما همچنان یک امضا (سه بایت اضافی) به ابتدا اضافه می کند. علاوه بر این، این بایت ها همیشه یکسان خواهند بود - کد را به ترتیب مستقیم بخوانید. اما در سرورها، به دلیل این چیز کوچک، ممکن است مشکلی ایجاد شود - krakozyabry بیرون خواهد آمد. پس به هیچ وجه از دفترچه یادداشت معمولی ویندوز استفاده نکنیدبرای ویرایش اسناد سایت خود، اگر نمی خواهید ظاهر کراکوزیابرس داشته باشید. به نظر من بهترین و ساده ترین گزینه ویرایشگر Notepad ++ ذکر شده است که عملاً هیچ اشکالی ندارد و فقط از مزایایی برخوردار است. در Notepad ++، هنگام انتخاب یک رمزگذاری، می توانید متن را به رمزگذاری UCS-2 تبدیل کنید، که ذاتاً بسیار نزدیک به استاندارد یونیکد است. همچنین در Notepad امکان رمزگذاری متن در ANSI وجود خواهد داشت. در رابطه با زبان روسی، قبلاً توسط ما در بالای ویندوز 1251 توضیح داده شده است. این اطلاعات از کجا آمده است؟ در رجیستری سیستم عامل ویندوز شما ثبت شده است - در مورد ANSI کدام کد را انتخاب کنید، در مورد OEM کدام را انتخاب کنید (برای زبان روسی CP866 خواهد بود). اگر زبان پیش‌فرض دیگری را روی رایانه خود نصب کنید، این کدگذاری‌ها با زبان‌های مشابهی از دسته ANSI یا OEM برای همان زبان جایگزین می‌شوند. پس از اینکه سند را در کدگذاری مورد نیاز خود در Notepad ++ ذخیره کردید یا سند را از سایت برای ویرایش باز کردید، می توانید نام آن را در گوشه سمت راست پایین ویرایشگر مشاهده کنید: برای جلوگیری از krakozyabrov، علاوه بر اقداماتی که در بالا توضیح داده شد، نوشتن اطلاعات مربوط به این رمزگذاری در سربرگ کد منبع همه صفحات سایت مفید خواهد بود تا هیچگونه سردرگمی در سرور یا میزبان محلی ایجاد نشود. به طور کلی در تمام زبان های نشانه گذاری فرامتن به جز Html از یک اعلان خاص xml استفاده می شود که نشان دهنده کدگذاری متن است.< ? xml version= "1.0" encoding= "windows-1251" ? >قبل از شروع به تجزیه کد، مرورگر می داند که از کدام نسخه استفاده می شود و دقیقاً چگونه کدهای کاراکتر این زبان باید تفسیر شوند. اما آنچه قابل توجه است این است که اگر سند را در یونیکد پیش‌فرض ذخیره کنید، می‌توان این اعلان xml را حذف کرد (اگر BOM وجود نداشته باشد کدگذاری UTF-8 یا اگر BOM وجود داشته باشد YUTF-16 در نظر گرفته می‌شود). در مورد یک سند Html، رمزگذاری مشخص شده است عنصر متا، که بین تگ های Head باز و بسته می شود: < head> . . . < meta charset= "utf-8" > . . . < / head>این ورودی کاملاً متفاوت از ورودی استاندارد در Html 4.01 است، اما کاملاً با استاندارد جدید Html 5 که به آرامی معرفی می شود مطابقت دارد و 100٪ توسط هر مرورگر مورد استفاده فعلی به درستی درک می شود. در تئوری، عنصر Meta که رمزگذاری سند Html را نشان می دهد بهتر است تنظیم شود تا حد امکان در سرفصل سندبه طوری که در زمان ملاقات با اولین کاراکتر متن که از ANSI اصلی نیست (که همیشه به درستی و با هر گونه تغییری خوانده می شود)، مرورگر باید از قبل اطلاعاتی در مورد نحوه تفسیر کدهای این کاراکترها داشته باشد. لینک اول

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

برای درک واقعی یونیکد، باید حداقل به صورت سطحی ویژگی های تمام اسکریپت هایی را که استاندارد به شما اجازه کار با آنها را می دهد تصور کنید. اما آیا واقعا برای هر توسعه دهنده ای لازم است؟ خواهیم گفت نه. برای استفاده از یونیکد در اکثر کارهای روزمره، کافی است حداقل اطلاعات معقولی را بدانیم و سپس در صورت نیاز به بررسی استاندارد بپردازیم.

در این مقاله، ما در مورد اصول اولیه یونیکد صحبت خواهیم کرد و آن مسائل مهم کاربردی را که مطمئناً توسعه دهندگان در کار روزانه خود با آن مواجه خواهند شد، برجسته خواهیم کرد.

چرا به یونیکد نیاز داشتید؟

قبل از ظهور یونیکد، رمزگذاری های تک بایت تقریباً به طور جهانی مورد استفاده قرار می گرفتند، که در آن مرز بین خود شخصیت ها، نمایش آنها در حافظه کامپیوتر و نمایش روی صفحه نمایش نسبتاً دلخواه بود. اگر با یک یا زبان ملی دیگر کار می کردید، فونت ها-رمزگذاری های مربوطه روی سیستم شما نصب می شد که باعث می شد بایت ها را از روی دیسک روی صفحه بکشید به گونه ای که برای کاربر معنا پیدا کند.

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

این رویکرد به طور کلی و رمزگذاری های تک بایتی به طور خاص دارای تعدادی اشکال مهم است:

  1. تنها با 256 کاراکتر می شد به طور همزمان کار کرد و 128 کاراکتر اول برای کاراکترهای لاتین و کنترل در نظر گرفته شده بود و در نیمه دوم علاوه بر کاراکترهای الفبای ملی، لازم بود جایی برای شبه گرافیک نیز پیدا شود. کاراکترها (╔ ╗).
  2. فونت ها به یک رمزگذاری خاص گره خورده بودند.
  3. هر کدگذاری مجموعه‌ای از کاراکترها را نشان می‌داد و تبدیل از یکی به دیگری تنها با از دست دادن جزئی امکان‌پذیر بود، زمانی که کاراکترهای گمشده با نویسه‌های گرافیکی مشابه جایگزین شدند.
  4. انتقال فایل ها بین دستگاه های دارای سیستم عامل های مختلف مشکل بود. لازم بود یا یک برنامه مبدل داشته باشیم یا فونت های اضافی را به همراه فایل حمل کنیم. وجود اینترنت همانطور که می دانیم غیرممکن بود.
  5. سیستم های نوشتاری غیرالفبایی در دنیا وجود دارد (نوشتن هیروگلیف) که در کدگذاری تک بایتی اصولاً قابل نمایش نیستند.

اصول اولیه یونیکد

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

مهم!یکی از اصول اصلی در فلسفه یونیکد، تمایز واضح بین کاراکترها، نمایش آنها در رایانه و نمایش آنها در دستگاه خروجی است.

مفهوم یک کاراکتر یونیکد انتزاعی معرفی شده است که منحصراً در قالب یک مفهوم گمانه زنی و توافق بین افراد وجود دارد که در استاندارد گنجانده شده است. هر کاراکتر یونیکد با یک عدد صحیح غیر منفی به نام نقطه کد آن مرتبط است.

بنابراین، برای مثال، کاراکتر یونیکد 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 بایت کدگذاری می شود.

مقالات مرتبط برتر