یونیکد یا همان UNIVERSAL CHARACTER SET TRANSFORMATION FORMAT یک استاندارد بینالمللی است که برای تبادل اطلاعات چندزبانه مورد استفاده قرار میگیرد. Unicode مستقل از سیستم عامل و یا برنامه و زبان خاصی، به هر یک از حروف یک کد یکتا اختصاص میدهد. Unicode میتواند تمام حروف زبانهای مختلف دنیا را در خود جای دهد. یونیکد میتواند برای وبسایتها و برنامهها بسیار مفید باشد. از این رو میتوان گفت که مهم نیست کاربران از چه وبسایت و یا چه مرورگری استفاده میکنند؛ تنها کافی است از Unicode پشتیبانی کند.
امروزه اکثر شرکتهای بزرگ دنیای کامپیوتر از این استاندار استفاده میکنند و همچنین میتوان گفت که تقریبا تمام برنامههای کاربردی جدید با این استاندارد کدگذاری شدهاند. گسترش استاندارد Unicode موجب شده تا تمامی فارسی زبانها هم بتوانند در دنیای اینترنت مطالب خود را عرضه کنند. یونیکد موجب شده تا فرایند ایجاد وبسایتها و برنامههای فارسی بسیار آسانتر و کم هزینهتر باشد. یونیکد در واقع مجموعهای از کاراکترست (charset) با اعداد منحصر به فرد است که به آنها در اصطلاح پوینت کد (Point Code) گفته میشود. هر Point Code کاراکتر واحدی را نمایش میدهد.
کدگذاری در کامپیوترها
همه ما میدانیم که کامپیوترها تنها با اعداد و ارقام سروکار دارند و تمام اطلاعات نوشتاری، صوتی و تصویری را به صورت اعداد و ارقام پردازش و ذخیره میکنند. حروف، اعداد و علایمی که در اپلیکیشنهای وب مورد استفاده قرار میگیرند، به آن شکلی که شما آنها را میبینید در کامپیوتر مدیریت نمیشوند. برای قابل فهم کردن اطلاعات برای کامپیوتر لازم است برای هر حروف از الفبا، یک عددی اختصاص دهیم. حروف و کاراکترها به مجموعهای از 0 و 1 تبدیل میشود تا مدیریت آنها برای کامپیوتر سادهتر باشد. اختصاص این کدها به اطلاعات توسط سیستمهای کدگذاری انجام خواهد شد. برای این منظور صدها نوع سیستم کدگذاری برای قابل فهم کردن زبانهای مختلف برای کامپیوترها به وجود آمد.
برای زبان فارسی هم تعداد زیادی سیستمهای کدگذاری به وجود آمد. هر شرکت نرمافزاری یک سیستم کدگذاری مخصوص به خودش را داشت. البته وجود تعداد زیاد سیستمهای کدگذاری تنها مختص به زبان فارسی نبوده و بیشتر زبانهای دیگر هم با این مشکل روبرو بودند.
روش های کدگذاری Unicode چیست ؟
یونیکد به سه روش کدگذاری را انجام می دهد که عبارتند از:
1- UTF-16
2- UTF-8
3- UTF-32
در واقع UTF مخفف عبارت Unicode Transfer Format و به معنای فرمت انتقال یونیکد است. در ادامه به این پرسش پاسخ خواهیم داد که UTF-8 چیست
تفاوت این روشهای کدگذاری، در نحوه ارایه حروف، اعداد و علائم، بین زبانهای کشورهای مختلف است. به طوری که نحوه ارایه کاراکترها در یک کشور با کشور دیگر متفاوت است.
UCS-2 / UTF-16 ساده و زیبا است؛ اما برخی بیتها در آن به هدر میروند. این سیستم نه تنها دو برابر ASCII است؛ بلکه ASCII تبدیل یافته، ممکن است به دلیل وجود بایتهای تهی حتی خوانا نباشد.
به همین دلیل UTF-8 طراحی شده است. هدف این سیستم آن است که در موارد ممکن کاراکترهای یونیکد را در یک بایت منفرد (ASCII) انکود کند و با استفاده از بایتهای تهی، اپلیکیشنهای ASCII را مختل نسازد. این انکودینگ پیشفرض XML است.
به طور کلی میتوان به نکات زیر اشاره کرد:
ملاحظاتمان در مورد UTF-8 را میتوانیم به صورت زیر جمعبندی بکنیم:
هیچ بایت تهی وجود ندارد. همه کاراکترهای ASCII یعنی شمارههای 0 تا 127 یکسان هستند. کاراکترهای غیر ASCII همگی با 1 به عنوان بزرگترین بیت آغاز میشوند.
متن ASCII به صورت یکسان و کارآمدی ذخیره میشود.
کاراکترهای یونیکد با 1 به عنوان بیت اول آغاز میشوند و میتوانند از سوی برنامههای صرفاً ASCII نادیده گرفته شوند (هر چند میتوانند در برخی مواد حذف شوند. برای اطلاعات بیشتر جزییات UTF-7 را ببینید).
یک تعادل بین زمان-فضا وجود دارد. بدین ترتیب باید روی هر کاراکتر یونیکد قدری پردازش صورت بگیرد؛ اما این هزینه ارزش خود را دارد.
مزایای utf-8 چیست؟
UTF-8 تنها الگوریتم موجود برای XML است که نیازی به BOM یا شاخص کدگذاری ندارد.
UTF-8 و UTF-16 روشهای کدگذاری استاندارد برای متون یونیکد در فایلهای کد utf-8 در html هستند، و UTF-8 پرکاربردترین آنها است.
رشته کد UTF-8 میتواند همانند یک الگوریتم اکتشافی ساده به نظر برسد. این ویژگی که بیشتر روشهای کدگذاری آن را ندارند، به UTF-8 اجازه میدهد نوع کدگذاری را تشخیص دهد. با این روش، بدون اینکه نیازی به افزودن بیت به آن داشته باشد، از خطاهای معمولی که هنگام تغییر یک سیستم به یک انکدینگ پیشفرض روی میدهد ، اجتناب خواهد کرد.
UTF-8 میتواند هر نوع کارکتر یونیکد را کدگذاری کند. فایلها را، بدون اینکه مجبور باشند فونت درستی را انتخاب کنند، با اسکریپتهای متفاوت به درستی نمایش دهد.
UTF-8، از کدهای ۰-۱۲۷ برای کاراکترهای اسکی استفاده میکند. این کد بر خلاف دیگر سیستمها، نیازی به افزایش حجم برای نشان دادن کدهای اسکی ندارد. این بدین معنی است که در تمامی نرمافزارهایی که از کاراکترهای ۷ بیتی پشتیبانی میکنند، قابل پردازش است.
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-16 و UTF-32 با utf-8 چیست این نکته را باید گفت که UTF-8، نیاز به فضای اضافی برای ذخیره کد ASCII زبان انگلیسی ندارد، و بیشتر زبانهای غرب اروپا را پوشش میدهد. برای زبانهای چینی، ژاپنی و کرهای نیز، به ۵۰ درصد فضای بیشتر نیاز دارد، و برای زبان یونانی و سریلیک، به ۱۰۰ درصد فضای اضافهتر نیازمند است.
در مقابل، UTF-16 به فضای اضافه برای زبان های چینی، ژاپنی، کره ای نیاز ندارد، ولی برای زبانهای اَسکی و زبانهای غرب اروپا ، یونانی و سریلیک نیاز به ۱۰۰ درصد کل فضای خود دارد.
UTF-32 ، طول ثابتی دارد و بیشترین فضا را اشغال میکند.
انجمن استاندارهای آمریکا در سال 1960 روش کدگذاری 7 بیتی ASCII را معرفی کرد ASCII مخفف عبارت American Standard Code for Information Interchange است که در آن زمان شامل 128 کاراکتر یا 7 بیت تعریف شد. این استاندارد در آن زمان بیشتر برای زبانهای لاتین کاربرد داشت. پس از آن در دهه 1980 تصمیم گرفتند که این استاندارد به جای استفاده از 7 بیت، از یک بایت کامل استفاده کند. یک بایت کامل شامل 8 بیت و 256 کاراکتر است. از این رو زبانهای دیگر نیز میتوانستند از این استاندارد استفاده کنند.
ASCII به روشنی مشخص نکرده که مقادیر بین 128 تا 255 به چه چیزی اختصاص دارد. در بین زبان دیگر استاندارد واحدی وجود نداشت و هر زبانی الفبای خود را با کد مختص به الفبای خود نشان میداد. پس در این زمان به استاندارد واحدی که با تمامی زبانها سازگار باشد و برای هر کاراکتر کد مختص به خود را داشته باشد، نیاز بود. برای حل این مشکل سازندگان رایانهها سعی کردند از صفحههای کد (Code Pages) استفاده کنند. اما باز هم این روش کارساز نبود. تا زمانی که افرد از کد صفحههای یکسانی استفاده کنند، همه چیز خوب پیش میرود. و اما اگر کد صفحهها برای افراد یکسان نباشد، همه چیز به هم میریزد.