لماذا يختلف عدد المحارف بين الأدوات؟
لأن «المحرف» قد يعني ثلاثة أشياء: بايتات (ما يقيسه عمود قاعدة البيانات أو حد حجم جسم HTTP)، أو نقاط ترميز (ما تعدّه معظم لغات البرمجة)، أو عناقيد رسومية (ما يراه الإنسان — رمز تعبيري بلون بشرة، أو حرف عربي مع تشكيله، عنقود واحد لكنه عدة نقاط ترميز وبايتات أكثر). يعرّف يونيكود حدود العناقيد والكلمات في UAX #29؛ والتحقق من الطول الذي يعدّ بطريقة في المتصفح وبأخرى على الخادم سيقبل أو يرفض مدخلات مختلفة.
كيفية استخدام عدّاد طول السلاسل النصية
- الصق السلسلة النصية التي تريد قياسها.
- قارن أرقام الطول الخمسة بالحد الذي يفرضه نظامك.
- استخدم التفصيل للعثور على الأحرف المخفية أو علامات التشكيل المركّبة.
مزايا عدّاد طول السلاسل النصية
- عناقيد الحروف (graphemes) ونقاط الترميز ووحدات UTF-16 وأحجام البايتات بترميزَي UTF-8 / UTF-16 جنباً إلى جنب
- كشف الأزواج البديلة (surrogate pairs) وعلامات التشكيل المركّبة (combining marks) والأحرف عديمة العرض وأحرف التحكم
- تفصيل لكل حرف مع نقطة الترميز والحجم المرمّز وفئة Unicode
- كشف نظام الكتابة (اللاتينية، العربية، الديفاناغارية، CJK، الرموز التعبيرية…)
- نتائج فورية أثناء الكتابة أو اللصق
مثال على عدّاد طول السلاسل النصية
لماذا تكسر سلسلة تحتوي على رموز تعبيرية عموداً من نوع VARCHAR(10)
الإدخال:
🚀👨👩👧 مرحباالنتيجة:
Graphemes 8 · Code points 12 · UTF-16 units 16 · UTF-8 bytes 33الأسئلة الشائعة حول عدّاد طول السلاسل النصية
لماذا يبلّغ JavaScript عن طول مختلف عمّا تبلّغ عنه قاعدة بياناتي؟
يعدّ JavaScript وحدات ترميز UTF-16، فيكون طول الرمز التعبيري 2. أما VARCHAR(n) في MySQL فيعدّ الأحرف (نقاط الترميز) لكن حدّه بالبايتات يعتمد على الترتيب (collation)، وتعدّ PostgreSQL الأحرف. تعرض هذه الأداة كل هذه القيم جنباً إلى جنب.
ما عنقود الحروف (grapheme cluster)؟
الوحدة التي يدركها القارئ كحرف واحد. فرمز العائلة التعبيري 👨👩👧 عنقود واحد لكنه خمس نقاط ترميز (ثلاثة أشخاص يربط بينهم رابطان عديما العرض ZWJ)؛ و"é" قد يكون نقطة ترميز واحدة أو اثنتين بحسب التطبيع (normalisation).
كيف يُحسب حجم UTF-8؟
تستهلك أحرف ASCII بايتاً واحداً، ومعظم الحروف اللاتينية/العربية/العبرية بايتين، والديفاناغارية وCJK ثلاثة بايتات، والرموز التعبيرية وغيرها من الأحرف خارج المستوى الأساسي (astral) أربعة بايتات.
هل يعرض التفصيل الأحرف غير المرئية؟
نعم — تُدرج روابط عديمة العرض (zero-width joiners) وعلامات BOM وأحرف التحكم وعلامات التشكيل المركّبة مع نقاط ترميزها حتى تتمكن من رصد الأحرف المخفية في النصوص المنسوخة.
ملاحظات تقنية
تُعدّ عناقيد الحروف باستخدام Intl.Segmenter عندما يوفره المتصفح، مع الرجوع إلى عدّ نقاط الترميز بخلاف ذلك. ويأتي حجم UTF-8 من TextEncoder، وهو دقيق لأي مدخل بما في ذلك الأحرف البديلة غير المقترنة (unpaired surrogates) التي تُرمَّز كـ U+FFFD.
المراجع
- UAX #29: Unicode Text Segmentationكيفية تقسيم النص إلى عناقيد رسومية وكلمات وجمل — ولماذا قد يختلف عدد «الأحرف» عن عدد نقاط الترميز أو البايتات.
- UAX #15: Unicode Normalization Formsصيغ التطبيع NFC وNFD وNFKC وNFKD — سبب اختلاف سلسلتين متطابقتين بصرياً عند المقارنة قبل التطبيع.
- RFC 3629: UTF-8, a transformation format of ISO 10646كيف تُرمَّز نقاط الترميز إلى بايت واحد حتى أربعة بايتات في UTF-8، وأي تسلسلات بايت غير صالحة.