لقد اكتشفت فجوة في سوق التواصل الاجتماعي الخاص بالمنشورات القصيرة جدًا جدًا. وبما أن Twitter أصبح يسمح بمنشورات من 280 حرفًا، لم يعد من يريد تحديثات سريعة على وسائل التواصل الاجتماعي يجد ما يلبّي حاجته. فتقرر إنشاء شبكتك الخاصة للتواصل الاجتماعي.
ولجعل منتجك لافتًا للنظر، تجعله متطرفًا وتسمح فقط بمنشورات من 5 أحرف أو أقل. وأي منشور يزيد على 5 أحرف يجب اقتطاعه إلى 5.
وللسماح لمستخدميك بالتعبير عن أنفسهم بالكامل، تسمح باستخدام الإيموجي وغيرها من أحرف Unicode.
مهمتك هي اقتطاع السلاسل النصية المُدخلة إلى 5 أحرف.
النص المخزَّن رقميًا يجب تحويله إلى تسلسل من البايتات. وهناك 3 أساليب شائعة لربط الأحرف بالبايتات.
إن UTF-8 وUTF-16 ترميزان من ترميزات Unicode، ما يعني أنهما قادران على تمثيل نطاق هائل من الأحرف، منها:
كلا الترميزين UTF-8 وUTF-16 متغيّرا الطول، ما يعني أن الأحرف المختلفة تشغل مساحات مختلفة.
تأمّل الحرف 'a' والإيموجي '😛'. في UTF-16 يشغل الحرف بايتين، بينما يشغل الإيموجي 4 بايتات.
الحيلة في هذا التمرين هي استخدام واجهات API المصممة حول أحرف Unicode (نقاط الترميز) بدلًا من وحدات الترميز في Unicode.
يمكن تمثيل سلسلة نصية "عادية" مرمّزة بترميز UTF-16 على أنها متتالية من المحارف، حيث يمكن أن يصل طول كل محرف إلى 16 بت (ومن هنا جاء الاسم UTF-16). هذا يعني وجود 2¹⁶ حدًا أقصى (اثنان مرفوعًا إلى القوة ستة عشر)، أو 65536 محرفًا ممكنًا يمكن تمثيلها بـ 16 بت، أي وحدة كود واحدة. تشكّل هذه المحارف الـ 65536 ما يُعرف بـالمجموعة الأساسية متعددة اللغات، وهي كبيرة بما يكفي لأكثر المحارف شيوعًا في معظم اللغات.
غير أن بعض الرموز لا يمكن أن تتسع في وحدة كود واحدة فقط. والحل هو تمثيلها بوحدتي كود. وحدتا الكود هاتان من ترميز UTF-16، ويُشار إليهما غالبًا باسم الزوج البديل، تشكّلان نقطة كود واحدة.
إذن، باختصار، عند الحديث عن ترميز UTF-16:
code unit عبارة عن 16 بت (أو أقل) تمثّل محرفًا واحدًا.code point عبارة عن وحدة كود واحدة أو وحدتين تمثّل محرفًا واحدًا.ولزيادة الالتباس، هناك أيضًا عناقيد المحارف الرسومية، وهي في الأساس متتاليات من محارف Unicode (نقاط كود) ينبغي التعامل معها كوحدة مرئية واحدة. على سبيل المثال، بعض الرموز التعبيرية، مثل هذا الرمز 👨👦.
معظم طرق JavaScript المدمجة تعمل مع السلاسل النصية المرمّزة بـ UTF-16، غير أنها تعمل بالاعتماد على وحدات كود UTF-16.
على سبيل المثال، فإن طريقة String.prototype.split("") تفصل السلسلة النصية حسب وحدات الكود.
ومن ناحية أخرى، تُكرِّر String iterators حسب نقاط الكود.
يمكنك قراءة المزيد، والعثور على أمثلة حول السلاسل النصية في Unicode، على MDN.
سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.