برنامه نویسی

تاریخچه UNICODE و آنچه باید در مورد UTF-8 بدانیم

UNICODE چیست

UNICODE چیست؟ وقتی شما کاراکتری را در یک برنامه ویرایش متن یا اپلیکیشن وب قرار می دهید ،این کاراکتر با استفاده از مجموعه ای از اعداد کد گذاری می شود. زمانی که مرورگر محتوای اپلیکیشن وب را دریافت می کند، این اعداد رمزگشایی شده و بر روی نمایشگر نمایش داده  می شوند.

روش های رمز گذاری بسیاری برای انتخاب در اپلیکیشن ها وجود دارند، پس کدام یک را باید برگزینیم؟

TEXT-ENCODING

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

جهت نیل به این هدف  انجمن استانداردهای آمریکا در سال ۱۹۶۰ یک روش رمزگذاری ۷ بیتی با نام American  Standard Code for Information Interchange (ASCII)  را معرفی کرد. در مجموعه کاراکتری که در ASCII تعریف شد ۱۲۸ کاراکتر (۷ بیت) ارایه می شد که یبشتر مخصوص زبان های لاتین بود. به تصویر زیر دقت کنید :

ASCII

در دهه ۱۹۸۰ تصمیم بر این شد که در مجموعه کاراکتر ASCII به جای ۷ بیت از یک بایت کامل یعنی ۸ بیت برای کدگذاری استفاده شود. بر این اساس تعداد کاراکترهای مجموعه کاراکتر به ۲۵۶ عدد می رسید. بر این اساس کد های بعد از ۱۲۷ و تا ۲۵۵ نیز به عنوان کد های رزرو شده در نظر گرفته شدند و  زبان های دیگر عموما در این بازه قرار می گیرفتند. اما در این محدوده بین زبان های مختلف استاندارد واحدی وجود نداشت وهر زبانی پوینت کد مختص الفبای خودش را نشان می داد به عبارتی دیگر پوینت کد ۲۰۰ در یک زبان حرف متفاوتی را در زبان دیگر بر می گرداند.

بنابراین نیاز به استاندارد واحدی بود تا ضمن سازگاری با تمامی زبان ها کد های منحصر به فردی را برای هر کاراکتر در نظر بگیرد.

Unicode

یونیکد

در ابتدا دو تلاش مستقل برای ایجاد مجموعه کاراکترهای واحد صورت گرفت.اولین آنها ISO-10646 پروژه سازمان بین المللی استانداردISO بعدی پروژه Unicode بود که توسط کنسرسیومی به نام کنسرسیوم Unicde سازماندهی می شد.  ISO با استانداردی به نام ISO-10646 کار خودرا آغاز کرد  و یک مجموعه کاراکتر جهانی (UCS) 31 بیتی بزرگ را معرفی کرد. کنسرسیوم Unicode نیز بر روی استانداردهای خودش که کار می کرد.  داشتن دو نوع استاندارد مطمئنا چیزی نبود ک بتوان آن را استاندارد واحدی نامید. هم ISO و هم Unicode این مطلب  را دریافتند و تصمیم گرفتند در سال ۱۹۹۱ به یکدیگر بپیوندند. از آن پس نسخه های جدید استانداردهای Unicode کاملا سازگار  و همگام شده با نسخه های متناظر ISO10646 شدند.

یونیکد یک مجموعه کاراکتر دارای  لیستی از کاراکترها با اعداد منحصر به فردی هستند که به آن در اصطلاح پوینت کد (Point Code) گفته میشود.  هریک Point Code ها کارکتر واحدی را نمایش می دهند .   بر این اساس استاندارد Unicode سه نوع روش رمزگذاری را تعیین می کند که به یک کاراکتر اجازه می دهد در داخل یک یا چند بایت رمزگذاری شود (یعنی در ۸ یا ۱۶ یا ۳۲ بیت). این سه نوع روش رمزگذاری به ترتیب UTF-16 , UTF-8  و UTF-32  نامیده می شوند.UTF مخفف فرمت انتقال یونیکد است.

تفاوت انکدینگ ها در نحوه متفاوت ارایه حروف اعداد وعلایم بین کشورهای مختلف است،به طوری که نحوه ارایه کاراکتر ها در یک کشور با کشور دیگر متفاوت است. UTF-8 تمامی کاراکترهای یونیکد را در یک دنباله بایت با طول متغیر منتقل می کند.

همانطور که قبلا گفته شد، utf-8 یک انکدینگ محبوب است، چرا بدین گونه است ؟

دلیل آن در این حقیقت نهفته است که تمامی کاراکترهای اسکی تحت یک بایت تنها در UTF-8   کد می شوند که نه تنها کاملا با نسخه های قدیمی سازگار است بلکه برای زبان انگلیسی و دیگر زبان های اروپایی نیز از نظر حجم بهینه تر است.

در کل UTF-8 نیاز به فضای اضافی برای ASCII زبان انگلیسی ندارد،و بیشتر زبان های غرب اروپا را پوشش می دهد، برای زبان های چینی/ژاپنی/کره ای، ۵۰ درصد بیشتر و برای زبان یونانی و سریلیک به ۱۰۰ درصد حجم کل خود نیاز دارد. در مقایسه UTF-16 نیاز به فضای اضافه برای زبان های چینی/ژاپنی/کره ای ندارد، ولی برای زبان های اسکی us  و زبان های غرب اروپا ، یونانی و سریلیک نیاز به ۱۰۰ درصد فضای خود دارد. UTF-32 نیز طول ثابتی دارد و بیشترین فضا را اشغال می کند. به دلیل اینکه زبان US و اروپای غربی بیشترین استفاده را در میان کاربران اینترنت دارد ، بنابراین UTF-8 به سرعت محبوب ترین Unicode در  محیط وب شد.

UTF-8 چیست ؟

UTF-8  یک الگوریتم است که اعداد کد پوینت را به باینری تبدیل می کند بطوری که بتوان آنها را بر روی دیسک ذخیره کرد.

در ابتدا به  یک نرم افزار کدی شبیه به کد زیر را ارایه می کنیم :

۱۱۰۱۰۰۰ ۱۱۰۰۱۰۱ ۱۱۰۱۱۰۰ ۱۱۰۱۱۰۰ ۱۱۰۱۱۱۱

نرم افزار می داند که داده ارایه شده یک رشته یونیکد بر مبنای  UTF-8 است و باید آن را بصورت متن به کاربر نشان دهد. در قدم اول  بر اساس روش رمزگشاییUTF-8  مقدار  باینری آن را به اعداد تبدیل می کند و در نهایت  این کد ها را بر می گرداند :

۱۰۴ ۱۰۱ ۱۰۸ ۱۰۸ ۱۱۱

نرم افزار می داند که این یک رشته یونیکد است ، لذا فرض می کند که هر عدد یک کاراکتر را بر می گرداند. در این هنگام  از مجموعه کاراکتر برای ترجمه هر عدد به یک کاراکتر متناظر با آن استفاده می کند. نتیجه کلمه Hello  است.

همانطور که گفته شد UTF-8 طول متغیری دارد و حین اینکه میتواند تا ۴ بایت افزایش یابد،کاراکترهای اصلی (ASCII) را می تواند با یک بایت نمایش دهد. چون طول متغیری دارد باید راهی باشد تا مشخص شود کاراکتر از یک بایت یا چند بایت ساخته شده است. UTF-8 ،در بایت اول تنها از ۷ بیت آن استفاده می کند و بیت اول آن برای این هدف کنار گذاشته شده است. بنابراین به نسبت گفته شده، ۲ بایت در UTF-8 11 بیت (۲^۱۱ = ۲۰۴۸ کاراکتر یا کد پوینت) ، ۳ بایت در UTF-8 از ۱۶ بیت پشتیبانی می کند (۲^۱۶ = ۶۵,۵۳۶) و ۴ بایت نیز ۲۱ بیت (۲^۲۱ = ۲,۰۹۷,۱۵۲)را فراهم می کند. واین هم بدین خاطر است که UTF-8 در هر بایت برای اینکه تشخیص دهد که آیا پوینت کد ارائه شده یک یا چند بایت است و یا اینکه ادامه یک پوینت کد چند بایتی است.
با این وجود تعداد تعدا کاراکتر های مجاز در UTF-8 در حال حاضر ۲۰۹۷۱۵۲ است در حالی که آخرین نسخه UNICODE 6.0 که در سال ۲۰۱۰ ارایه شد کمی بیش از ۱۰۰۰۰۰ کاراکتر یا پوینت کد را تعریف می کند.
Utf-8 یک روش انکدینگ کاراکتر است که قابلیت انکدینگ تمامی کاراکترهای موجود و یا به عبارتی تمامی کد پوینت های موجود در یونیکد را دارد.
برای مثال ، شمای کاراکتر انکدینگ ASCII شامل ۱۲۸ پوینت کد در محدوده ۰ تا ۷F (در مبنای هگزادسیمال) است، Extended ASCII شامل ۲۵۶ پوینت کد در محدوده ۰ تا FF است و یونیکد نیز شامل ۱۱۱۴۱۱۲ پوینت کد در محدوده ۰ تا ۱۰FFFF است. فضای یونیکد به خاطر ساختار چند زبانه بودنش به ۱۷ گروه تقسیم می شود که هر کدام ۶۵۵۳۶ (۲ به توان ۱۶) کد پوینت دارد.بنابراین کل حجم یونیکد می شود :
۱۷ × ۶۵,۵۳۶ = ۱,۱۱۴,۱۱۲.
UTF-8 غالب ترین روش رمزگذاری کاراکتر در میان وب سایت ها است. UTF-8 برای هر یک از ۱۱۱۲۰۶۴ پوینت کد های معتبر یونیکد (۱۱۱۴۱۱۲ منهای ۲۰۴۸ پوینت کد های جانشین) از یک تا ۴ بایت استفاده می کند. برای رمزگذاری پوینت کدهای که مقادیر عددی کمتر دارند از بایت های کمتری استفاده می شود. ۱۲۸ کاراکتر اول یونیکد که دقیقا مطابق با کدهای اسکی هستند با استفاده از یک بایت مجزا با مقادیر باینری مشابه اسکی رمز گذاری می شوند که باعث می شود متون اسکی پس از رمزگذاری در UTF-8 نیز معتبر باشند.
UTF-8 اولین بار بطور رسمی در کنفرانس USENIX در سال ۱۹۹۳ معرفی شد. در حال حاضر UTF-8 رایج ترین روش اندینگ در فایلهای HTML است.
همانطور که در تصویر ذیل مشاهده می کنید UTF-8 از دیگر اندکدینگ های اصلی استفاده شده در متن وب سایت ها در حال حاضر پیشی گرفته است و در سال ۲۰۱۰ نزدیک به ۵۰ درصد و در جولای سال ۲۰۱۵ به ۸۴ درصد رسیده است.
تشریح عمکرد
طراحی UTF-8 را می توان در این جدول مشاهده کرد. در این جدول کارکاترهای x با بیت های کد پوینت جایگزین می شوند :

utf-8

مزایای این نوع طراحی

– سازگاری با نسخه های قدیمتر تنها از یک بایت برای مقادیر اسکی که از ۰ تا ۱۲۷ هستند استفاده می شود. در این حالت کد UTF-8 مقداری مشابه با کد اسکی دارد.
– تمایز واضح بین کارکترهای تک بایت و چند بایت : پوینت کد های بالاتر از ۱۲۷ توسط توالی های چند بایته نمایش داده می شوند. این بایت های توالی توسط عدد یک به عنوان بایت پیشین نمایش داده می شوند. در توالی های بالاتر تعداد ۱ بیشتری وجود دارد که نهایتا با یک صفر ختم می شود.
– تشخیص واضح طول کد ها : تعدا عدد ۱ موجود در بایت های پیشین تعدا بایت ها ی توالی را مشخص می کند و نیازی به ارزیبای کل بایت ها نیست.
– برای نمایش ۱۲۸ کاراکتر اول نیاز به یک بایت (US-ASCII) و کاراکترهای بعدی (۱۲۷-۲۵۵) نیاز به دو بایت دارد که البته بسیاری از زبان های لاتین ،یونانی ،سریلیک، عربی و عبری را پوشش می دهد. برای بقیه زبان هایی که در گروه چند زبانه قرار می گیرند و شامل تمامی کاراکتر های رایج است به انضمام زبان چینی،ژاپنی،کره ای به سه بایت نشاز است. گروه باقیمانده یونیکد نیز که شامل بسیاری از کاراکترهای CJK، اسکریپت های تاریخی،علامت های ریاضی و علامت های تصویر نگاری هستند برای نمایش به چهار بایت نیاز دارند.

مثال
در مثال زیر مراحل انکدینگ علامت یورو € را ملاحظه می کنید :
۱. پوینت کد یونیکد برای € مقدار U+20AC است.
۲. بر اساس جدولی که در بالا نشان داده شد، این مقدار برای رمزگذاری نیاز به ۳ بایت خواهد داشت که بین U+0800 و U+FFFF قرار می گیرد.
۳. مقدار آن در مبنای شانزده مقدار ۲۰AC و در مبنای دودویی مقدار ۰۰۱۰ ۰۰۰۰ ۱۰۱۰ ۱۱۰۰. است. دو صفر پیشوند به این دلیل اضافه می شوند که مطابق جدول نشان داده شده شد رمزگذاری در حالت ۳ بایته دقیقا به ۱۶ بیت از پوینت کد نیاز دارد.
۴. به دلیل اینکه رمزگذاری آن ۳ بایت طول دارد، بایت پیشوند آن با ۳ تا یک و سپس یک صفر شروع می شود(۱۱۱۰…).
۵. ۴ بیت باقیمانده این بایت نیز از ابتدای پوینت کد برداشته می شود : (۱۱۱۰ ۰۰۱۰ ۰۰۰۰ ۱۰۱۰ ۱۱۰۰). و ۱۲ بیت باقیمانده پوینت کد جداگانه رمزگذاری می شوند. (…۰۰۰۰ ۱۰۱۰ ۱۱۰۰).
۶. ۱۲ بیت باقیمانده از وسط به دو نیم شده و ۱۰ به ابتدای هر کدام از بلاک های ۶ بیتی افزوده می شود تا دو بایت ۸ بیتی ایجاد شود. در نتیجه خواهیم داشت : ۱۰۰۰ ۰۰۱۰ و ۱۰۱۰ ۱۱۰۰
۷. حال سه بایت ۱۱۱۰ ۰۰۱۰ و ۱۰۰۰ ۰۰۱۰ و ۱۰۱۰ ۱۱۰۰ بصورت
۱۱۱۰ ۰۰۱۰ ۱۰۰۰ ۰۰۱۰ ۱۰۱۰ ۱۱۰۰ در مبنای ۱۶ بصورت E2 82 AC نوشته می شود. در نمونه جدول زیر می توانید ترجمه برخی علایم رایج را مشاهده کنید.utf-8-2

UTF-8 و BOM

بسیاری از برنامه های ویندوز (به انضمام Notepad) بایت های 0xEF, 0xBB, 0xBF را به ابتدای هر فایل متنی که بر اساس UTF-8 ذخیره می شود اضافه می کنند. این انکدینگ UTF-8 از علامت گذاری ترتیب بایت ها BOM است. در این حالت نرم افزاری که از انکدینگ های چد بایته آگاهی ندارد BOM را بصورت کاراکترهای ناخوانا در ابتدای سند نشان می دهد. به عنوان مثال در نرم افزارهایی که متن را بر اساس ISO 8859-1 یا WINDOWS-1252 ترجمه می کنند BOM را بصورت “” نشان می دهند.
استاندارد یونیکد نه نیازی به استفاده از BOM برای UTF-8 دارد و نه آن را توصیه می کند، اما اجازه می دهد که چینین کاراکترهایی در ابتدای یک فایل باشند. حضور UTF-8 BOM در نرم افزارهایی که می توانند UTF-8 را پشتیبانی کنند شاید مشکلاتی را بوجود بیاورد :
– مترجم های زبان های برنامه نویسی که اختصاصا برای UTF-8 طراحی نشده اند ، غالبا مقادیر ثابت STRING می توانند UTF-8 را پشتیبانی کنند ولی نمی توانند BOM موجود در ابتدای فایل را ترجمه کنند.
– برنامه هایی که نوع فایل را با بررسی کاراکتری ابتدایی تشخیص می دهند ممکن است در صورت وجود BOM دچار مشکل شوند.
– برنامه هایی که اطلاعاتی را در شروع یک فایل قرار می دهند،از BOM استفاده نخواهند کرد.

مزایای UTF-8

– UTF-8 تنها انکدینگ موجود برای XML است که نیازی به BOM یا شاخص رمزگذاری ندارد.
– UTF-8 و UTF-16 روش های رمزگذاری استاندارد برای متون یونیکد در فایلهای HTML هستند، و UTF-8 ارجح ترین و پرکاربردترین روش رمزگذاری است.
– استرینگ های UTF-8 می توانند همانند یک الگوریتم اکتشافی ساده به نظر برسد. بسیار بعید است که متنی در هر کدام از استانداردهای دیگر (مانند ISO/IEC8859-1 ) در UTF-8 معتبر باشند. این ویژگی است که بیشتر روش های کدگذاری دیگر آن را ندارند و به UTF-8 اجازه می دهد برای تشخیص اینکه چه نوع کدگذاری در حال استفاده است نیازی به افزودن داده به آن ندارد ،و از خطاهای معمولی که هنگام تغییر یک سیستم به یک انکدینگ پیش فرض روی می دهد ، اجتناب کند.
– UTF-8 می تواند هر نوع کارکتر UNICODE را کدگذاری کند، فایلهای با اسکریپتهای متفاوت می توانند به درستی نمایش داده شوند بدون اینکه مجبور باشند کد پیج یا فونت درستی را انتخاب کنند.
– UTF-8 از کدهای ۰-۱۲۷ برای کاراکترهای اسکی استفاده می کند لذا نیازی به افزایش حجم برای نشان دادن کد های اسکی ندارد. این بدین معنی است که تمامی نرم افزارهایی که از کاراکترهای ۷ بیتی پشتیبانی می کنند قابل پردازش است.
– UTF-8 قابلیت خود هماهنگی دارد : اگر بایت ها به دلیل خطا یا مشکلی از بین بروند ، می توان شروع کارکاتر معتبر بعدی را پیدا کرد و پردازش را ادامه داد.
– رمزگذاری در UTF-8 نیازی به عملیات ریاضی مانند ضرب و تقسیم ندارد و از عملیات ساده بیتی استفاده می کند.

معایب

– کاراکترهایی که در روش های رمزگذاری دیگر  مانند ISO-8859 و WINDOWS-1252 می توانند با یک بایت نشان داده شوند در UTF-8 باید با دو بایت نمایش داده شوند.
– یک مترجم UTF-8 که سازگار با نسخه های کنونی استاندارد شده نیستند ممکن است یک عدد شبه UTF-8 متفاوت را دریافت کند و آن را به خروجی یونیکد تبدیل کند.
– متون رمزگذاری شده UTF-8 بزرگتر از انکدینگ های تخصصی تک بایت هستند به جز کاراکترهای ASCII
– در utf-8 این امکان وجود دارد که یک استرینگ را از وسط یک کاراکتر بشکافد. این امر ممکن است باعث شود ایجاد یک استرینگ نامعتبر شود، اگر دو قطعه جدا شده نتوانند بعدا در توالی هم قرار بگیرند.
– بسیاری از نرم افزارها مانند ویرایشگر متن، نمی توانند نمایش دهند یا ترجمه کنند utf-8 را مگر اینکه آن متن با یک BOM شروع شود.
– Utf-8 نسبت به یک انکدینگ چند بایته که تنها برای یک زبان خاص طراحی شده است حجم بیشتری میگیرد. انکدینگ زبان های اسیای شرقی نیاز به دو بایت داردبرای هر کاراکتر دارد در صورتی که در utf-8 به ۳ بایت نیاز است.

با توضیحات ارایه شده، می توان دریافت چرا UTF-8 پرکابرد ترین روش کدگذاری در فضای وب است و محبوبیت آن نیز روز به روز در حال افزایش است. در نظر داشته باشد با وجود وب سایت های چند زبانه سازگاری وب سایت با استانداردهای کوجود مهم ترین عاملی است که در انتخاب نوع روش رمزگذاری خود باید آن را در نظر بگیرید.

برچسب ها

نیما حسن زاده

در IT قله های زیادی هست که هنوز فتح نشده اند . . . | مدیر سرور ایران هاست ، کارشناس ارشد مدیریت فناری اطلاعات، کارشناس مهندسی فناوری اطلاعات

نوشته های مشابه

‫۳ نظرها

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

    1. باسلام و وقت بخیر؛
      باتشکر از حسن توجه شما، تصاویر اصلاح شدند و در حال حاضر امکان مشاهده آنها را دارید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید

بستن
بستن
بستن