متوفر أيضًا بلغات أخرى: English · Español · Português · Français
مقيّس يونيكود
صورُ التقييس الأربع معًا، مع بيانٍ محرفًا محرفًا لما تطويه كلُّ صورةٍ أو تغيّره أو تطرحه.
ما تقييسُ يونيكود؟
كثيرًا ما يعطيك يونيكود أكثرَ من طريقةٍ لكتابة الشيء نفسِه. فالحرفُ é قد يكون موضعَ ترميزٍ واحدًا هو U+00E9، وقد يكون الحرفَ e تتبعه علامةُ نبرٍ حادةٍ ضامّة. وكلاهما يظهر متطابقًا وكلاهما صحيح، غير أنهما سلسلتا بايتاتٍ مختلفتان: فالمقارنةُ الساذجة تقول إنهما نصّان مختلفان، والبحثُ عن أحدهما لا يجد الآخر، وقاعدةُ بياناتٍ فيها قيدُ تفرّدٍ تقبلهما معًا راضيةً.
والتقييسُ هو العلاج. فهو يعيد كتابةَ النص في واحدةٍ من أربع صورٍ معرَّفة، حتى ينتهي كلُّ ما يعني الشيءَ نفسَه مكتوبًا الكتابةَ نفسَها. وتسمّى الصورُ NFC وNFD وNFKC وNFKD، والاختيارُ بينها هو الجزءُ الذي يهم حقًّا.
والأسماءُ تحمل قرارين مستقلين. فالـC للمركَّبة والـD للمفكَّكة: أتنتهي é موضعَ ترميزٍ واحدًا أم اثنين. وأما الـK، وهي المربكة، فللتوافق، وذاك محورٌ آخر بالكلية: يحكم أتُدمَج المحارفُ التي تتشابه فحسب بعضُها في بعض. والخطأُ في الأول لا يكلّف شيئًا يراه القارئ. والخطأُ في الثاني يتلف المعلومة.
كيف تستعمله؟
- ألصق أيَّ نصٍّ في الصندوق. فتُحسَب الصورُ الأربع وأنت تكتب. وكلُّ واحدةٍ موسومةٌ قياسيةً أو توافقية، ومعلَّمةٌ حين تختلف عما كتبت.
- قارن العدّاتِ الثلاث تحت كل صورة. فوحداتُ UTF-16 هي ما يبلّغه طولُ النص، ومواضعُ الترميز ما يعدّه يونيكود، والمحارفُ ما يعدّه القارئ. وقد تعطي الكلمةُ الواحدة ثلاثةَ أجوبةٍ مختلفة، وNFC وNFD يختلفان في الأولين وهما يعنيان النصَّ نفسَه.
- وانظر ما تصنعه به حيلةُ إزالة الحركات. فاللوحةُ السفلى تجري الوصفةَ المعتادة وتريك، محرفًا محرفًا، أيَّ الحروف طُويت إلى ASCII وأيُّها تُرك وأيُّها اختفى بالكلية.
القياسيُّ آمنٌ والتوافقيُّ ليس كذلك
NFC وNFD صورتان قياسيتان. تعيدان الترتيبَ بلا تغيير المعنى: فـé موضعَ ترميزٍ واحدًا وé موضعين هما المحرفُ نفسُه حقًّا، والانتقالُ بينهما عكوسٌ بالمعنى الذي يهم، لأن NFC مطبَّقًا على الصورة المفكَّكة يعيد المركَّبةَ بعينها. وتطبيقُ أيٍّ منهما على نصٍّ كيفما كان آمن، وNFC هي المطلوبةُ في أكثر الأحوال، لأنها ما تتوقعه الوِبُ وأسماءُ الملفات وأكثرُ قواعد البيانات.
وأما NFKC وNFKD فصورتا توافق، وهما عمليةٌ من نوعٍ آخر باسمٍ متشابه. تدمجان المحارفَ في أخرى لا تعدو أن تشبهها. فالاثنانِ المرفوعة في m² تصير 2 عاديًّا، فيصير المترُ المربع m2. والرباطُ fi يصير حرفين. والعددُ الروماني Ⅳ يصير الحرفين I وV. وعلامةُ العلامة التجارية تصير TM. والكسرُ ½ يصير 1⁄2. والأرقامُ المدوَّرة تصير أرقامًا عادية، والحروفُ اللاتينية كاملةُ العرض تصير حروفًا معتادة.
وليس شيءٌ من ذلك عيبًا — بل هو المقصودُ كلُّه. فالطيُّ التوافقي موجودٌ ليجد البحثُ عن m2 مطلوبَه في m²، ولئلا تُنتحَل المعرِّفاتُ بمحارفَ شبيهة. غير أنه في اتجاهٍ واحد. فمتى طويتَ مرفوعًا إلى رقمٍ لم تعد تعرف أكان الأصلُ m² أم m2، وإن كان ذلك التمييزُ يحمل معنًى فقد ذهب. فاستعمل الصورتين التوافقيتين لمفاتيح المقارنة وفهارس البحث؛ ولا تخزّن ناتجَهما كأنه نصُّ المستعمل.
والقياسُ وراء هذا جديرٌ بأن يقال كما هو. فعلى مواضع الترميز المسنَدة البالغة 288,767: يغيّر NFC منها 1,120، وNFD يغيّر 13,233، وNFKC يغيّر 4,928، وNFKD يغيّر 17,029. وكلُّ زوجٍ من الصور يختلف عن كل زوجٍ آخر في موضعٍ ما: فNFC مقابل NFKD في 15,930 موضعَ ترميزٍ وحدها. وقد ينتفخ محرفٌ واحدٌ انتفاخًا هائلًا: فـU+FDFA، وهو رباطٌ عربي، يتمدّد إلى ثمانيةَ عشرَ محرفًا تحت NFKD.
حيلةُ إزالة الحركات تحذف حروفًا حقيقية
ابحث عن كيفية إزالة الحركات من نصٍّ تجد الوصفةَ الثلاثيةَ نفسَها في كل مكان: قيّس إلى NFD، واحذف علاماتِ الضم، وأبقِ ASCII وحده. وهي تعمل عملًا بديعًا في المثال الذي يجرّبه الجميع. فـcafé تصير cafe، وnaïve تصير naive، وتُنسخ الحيلةُ إلى مشروعٍ آخر.
ويحسن التدقيقُ في موضع اعوجاجها، لأن الروايةَ المعتادة تقلبه. فخطوةُ التقييس لا تحذف شيئًا البتة: فبالقياس على كل الحروف اللاتينية، حذفُ علامات الضم بعد NFD يزيل صفرًا بالضبط. وإنما يصنع الضررَ مرشِّحُ ASCII بعده. فحرفٌ مثل ß أو ø أو ł أو đ أو ħ أو þ أو æ ليس فيه حركةٌ تُحذف أصلًا؛ فينجو من التقييس سليمًا تمامًا، ثم يُطرح لجريمة أنه ليس بين a وz.
وبمسحٍ على الحروف اللاتينية كلِّها في يونيكود وعددُها 907، يطوي NFD متبوعًا بذلك المرشِّح 540 منها إلى ASCII ويحذف 367 حذفًا تامًّا. والانتقالُ إلى NFKD يحسّنه قليلًا: 578 مطويّة، و329 محذوفة، منقذًا 38 حرفًا يفقدها NFD لأن لها تفكيكًا توافقيًّا حيث لا تفكيكَ قياسيًّا لها.
وفي الكلمات العادية ليست النتيجةُ خفيّة. فـStraße تصير Strae، وليست Strasse وهي النقحرةُ الألمانية الصحيحة، بل كلمةٌ ينقصها حرفٌ ببساطة. وŁódź تصير odz. وĐà Nẵng تصير aNang. وÆrø، وهي جزيرةٌ دنماركية، تصير الحرفَ r وحده، لأن حرفين من ثلاثتها يُحذفان والناجي r لاتينيٌّ لم يُمسّ. فإن احتجت طيَّ نصٍّ إلى ASCII فأنت تحتاج جدولَ نقحرة، لا صورةَ تقييس.
حدودٌ صادقة
الصورُ الأربع يحسبها تنفيذُ المعيار في متصفحك أنت، وهو نفسُه الذي ستستعمله شفرتُك. وهذه الصفحةُ لا تنفّذ التقييس؛ بل تريك ما تصنعه المنصّةُ وتعدّ العواقب.
وعرضُ حيلة الحركات يستنسخ المقطعَ الشائع عمدًا، بمدياتِ علامات الضم التي فيه. وهو موجودٌ ليُري ما تصنعه تلك الوصفةُ بعينها، لا ليكون أفضلَ طاوٍ إلى ASCII ممكنًا: فأداةٌ تستعمل صامتةً خوارزميةً أفضل تكون تجادل شيئًا لم يكتبه أحد.
والتقييسُ ليس طيَّ الحالة، وليس وحده حدًّا أمنيًّا. فـNFKC يُستعمل جزءًا من مقارنة المعرِّفات في معايير عدّة، غير أن الطيَّ وحده لا يجعل معرِّفين آمنَي المعاملةِ على التساوي؛ والمحارفُ الملتبسة بين الخطوط مشكلةٌ أخرى لها بياناتُها في يونيكود، ولا تتناولها هذه الصفحة.
وأخيرًا فالأرقامُ المذكورة أعلاه مرتبطةٌ بإصدارٍ من يونيكود. قيست على الإصدار الذي تحمله مكتبةُ بايثون القياسية، وقوبلت بتنفيذ متصفحك، والسكربتُ الذي أنتجها محفوظٌ إلى جوار الموقع لتُعاد توليدُ الأرقام بدل تصديقها.
لماذا هو مجاني؟
لأن تشغيله لا يكلّف شيئًا. فكلُّ صورةٍ تُحسب في متصفحك وأنت تكتب؛ لا يُرفع شيء، ولا يُسجَّل شيء، ولا يرى خادومٌ نصَّك.
فلا حساب ولا تسجيل ولا شيءَ محجوب. والسلوكُ من ملحق يونيكود الذي ينفّذه متصفحك أصلًا، وقياساتُ هذه الصفحة مقابَلةٌ بتنفيذٍ آخرَ في بايثون، فالأرقامُ مقارنةٌ لا دعوى.