كونك مبرمج فبالتأكيد تعرف أن كل الأرقام والأحرف تخزن بشكل ثنائي Binary في أماكن التخزين Storage، وتعلم أنه بسبب صعوبة التعامل مع الأرقام الثنائية بالنسبة لنا البشر فإنه يمكن التعامل بصيغ أخرى مثلاً Hex أو حتى بشكل عشري Decimal .
ولكي نتعامل مع الأحرف Characters فيجب أن تحولها بشكل أو أخر لأرقام يفهمها الحاسب ومن هنا وجد أول طريقة تحويل Mapping من الأحرف الى الأرقام وهي نظام ال ASCII حيث هو Character Set للأحرف الانجليزية والأرقام وبعض رموز التحكم Control Characters .
في بادئ الأمر كان أي حرف عباره عن 7بت وبالتالي مجمل الحروف التي نستطيع التعامل معها هي 127، ولهذا السبب تم تطوير ال Extended ASCII وجعله 8 بت واضافه رموز وأشكال أخرى وهكذا اصبحنا نتعامل مع 256 حرف.
هذه ال 256 لم تكن كافيه لبقية العالم لترميز أحرفهم ولغاتهم، فكان الحل بأنه تكون أول 127 حرف هي ثابته كما هو ال ASCII العادي ال 128 والبقية تكون للغه التي تريد التعامل معها وهكذا سنجد لكل لغه Code Page خاصه بها، وهكذا اذا استخدمنا ال Code Page للغه العربية (ISO-8859-6 أو Windows-1256 في نظام الويندوز) سوف نحصل على ذلك، ونسمى العملية Encoding بمعنى أذا كان لدينا رقم 200 واستخدام Code Page عربي فأنني سأحصل على الحرف العربي الذي يقع في تلك الخانه ، وهكذا اذا استخدمت Code Page أخر سوف أحصل على شيء أخر.
المشكلة أن هناك لغات لا تكفيها (بايت واحد) الى 256 وبها أحرف أكثر ومن هنا طور نظام ال Unicode وصمم في الأساس نظام 16 بت (بايتين لكل حرف) ، في ال Unicode قام بوضع ارقام لكل حرف مثل الأسكي (الأرقام تسمى Code Point) وهكذا أي حرف في اي لغه موجودة تم اسناد Code Point له (مجال ال Code Point هو من صفر الى أكثر من مليون 1,114,111 حرف، وفي ال Unicode يتم استخدام نظام السادس عشر Hex في الكتابه مع علامه U+ في البدء، وبالتالي مجال ال Code Point هو من U+0000 الى U+10FFFF).
بما أن ال Unicode في الأساس صمم لكي يكون 16 بت ( يحمل حد أقصى 65536 حرف المجال من U+0000 الى U+FFFF ) فأن اول 16 بت تسمى Basic Multilingual Plane (اختصاراً BMP) والبقية من U+10000 الى U+10FFFF تسمى Supplementary Characters. وهكذا فأن اي حرف في ال Unicode هو أما يكون في BMP أو يكون Supplementary.
هكذا الكلمة Hello في الUnicode لها ال Code Point:
U+0048 U+0065 U+006C U+006C U+006F
تجد أيضاً في موقع لحن الحياة
هذا فقط عباره عن ارقام عادية،، ولكن لكي نتعامل معها ونقوم بتخزينها سوف نحتاج لعمل Encoding لها (في السابق قبل وجود ال Unicode كنا نقوم بعمل Encoding لكي نحصل على احرف بلغات اخرى) بينما هنا في ال Unicode سوف نقوم بالEncoding حتى نستطيع تخزينها والتعامل معها، ويكون على أساس الحجم Code Unit ولدينا 3 طرق لعمل Encoding وهي UTF-8 و UTF-16 و UTF-32.
حتى لا تخطئ التحويل Encoding يكون من Code Point الى واحد أو أكثر Code Unit على حسب الCode Unit أو ال Encoding المستخدم.
في ال UTF-32 نقوم بتمثيل أي حرف Unicode (أي Code Point) الى Code Unit واحدة فقط، وبما أننا نتعامل مع وحدة 32 بت فاذا أي حرف يكون عباره عن 4 بايتات وهي بالطبع تأخذ حجماً أكثر من الEncoding الأخرى.
في الUTF-16 تستخدم واحد أو أثنين Code Unit لتمثيل اي Code Point، فالأحرف ال BMP تمثل بCode Unit واحد فقط (وبالتالي تكون 2 بايت فقط) أما الأحرف ال Supplementary تمثل باثنين Code Unit وبالتالي تمثل ب 4 بايتات.
في ال UTF-8 فهي تمثل بواحد الى 4 Code Unit (أي واحد الى 4 بايت) لتمثيل الCode Point، فالمجال من U+0000 الى U+007F يمثل ب 1 بايت، أما المجال من U+0080 الى U+07FF يمثل ب 2 بايت، أما المجال U+0800 الى U+FFFF يمثل ب 3 بايتات ، أما المجال U+10000 الى U+10FFFF يمثل ب 4 بايتات.
ميزة ال UTF-8 أن الأحرف العادي التي كانت تمثل في ال ASCII بواحد بايت ما زالت تمثل بواحد بايت ولذلك فأنه متوافق Compatible مع ال ASCII.
بحكم أن الأحرف العربية هي موجودة ضمن ال BMP ففي الغالب في لغات البرمجة (مثلاً جافا ودوت نت) نستخدم ال String وهو UTF-16 فيكون الحرف الواحد هو 2 بايت ، لكن اذا قمت بجعل البرنامج يدعم اللغات الصيينية واليابانية فأنت تحتاج الى أن تتعامل مع ال Supplementary وكافة اللغات تحتوي دعماً لذلك أيضاً حيث كل حرف يمثل ب 4 بايت في ال UTF-16 لهذه الأحرف Supplementary .
المهم في ال Unicode أن تعلم أن الحرف قد يكون حجمه مختلف بناء على ال Encoding المستخدم وأنت تستخدم ال Encoding الصحيح أيضاً.
الحقيقة الموضوع مهم جداً لأي مطور ومهندس برمجيات فلا شك أنك في يوم من الأيام ستواجه مشكلة في ال Encoding فتعلمك لهذا الموضوع يجعلك تحله بشكل علمي. وسوف نوسع النقاش فيما بعد ونتحدث عن الموضوع ضمن نطاق لغه البرمجة ودعمها لهذا الأمر.
شكرا على الإفادة <3
أهلا بك صديق دائم لنا