طول النص

قِس سلسلة نصية بعدة طرق مفيدة في آن واحد، بما في ذلك الرموز التعبيرية والعبرية.

الإدخال
الأحرف
0
نقاط الترميز
0
وحدات UTF-16
0
الكلمات
0
الأسطر
0

لماذا لسؤال «ما طول هذا النص؟» أكثر من إجابة

يبدو سؤالًا بديهيًا، لكن طول النص يعتمد كليًا على ما تعدّه. الإنسان يعدّ الأحرف التي يراها. قاعدة البيانات تعدّ المساحة التخزينية التي تشغلها القيمة. أما JavaScript فتعدّ شيئًا مختلفًا. وعندما تتباين هذه الأرقام — وهو ما يحدث كثيرًا مع الرموز التعبيرية والحروف المشكَّلة والكتابات غير اللاتينية — يصبح «الطول» الواحد مضللًا. تعرض هذه الأداة خمسة مقاييس ذات معنى جنبًا إلى جنب لتختار ما يهمّك في حالتك.

شرح المقاييس الخمسة

  • الأحرف (الوحدات الرسومية / graphemes): ما يدركه الإنسان كحرف واحد. رمز تعبيري لعائلة مثل 👨‍👩‍👧، أو حرف مع علامة تشكيل مدمجة، يُحسب كواحد — وهذا هو العدّ الذي يطابق ما تراه بعينك.
  • نقاط الترميز (code points): عدد قيم Unicode العددية. قد يتكوّن حرف مرئي واحد من عدة نقاط ترميز مدمجة، لذا يكون هذا الرقم غالبًا أكبر من عدد الوحدات الرسومية.
  • وحدات UTF-16: القيمة التي تُبلغ عنها JavaScript من خاصية ‎.length للسلسلة. الأحرف خارج المستوى المتعدد اللغات الأساسي (معظم الرموز التعبيرية) تشغل وحدتَي UTF-16 لكل منها.
  • الكلمات: عدد الرموز الشبيهة بالكلمات، المكتشَفة بطريقة تراعي Unicode بدل التقسيم الساذج على المسافات.
  • الأسطر: عدد الأسطر، مع احتساب كل فاصل سطر.

لماذا تكسر الرموز التعبيرية والتشكيل العدّ الساذج

النص الحديث مبني على Unicode، الذي يمثّل كثيرًا من الأحرف المرئية كتسلسلات لا كوحدات مفردة. رمز العلم التعبيري هو رمزا مؤشِّر إقليمي. ورمز العائلة هو عدة أشكال مرتبطة بأحرف «رابط بعرض صفري» غير مرئية. والحرف é قد يكون نقطة ترميز واحدة، أو حرف e عاديًا يتبعه تشكيل مدمج. كلٌّ منها يبدو حرفًا واحدًا لكنه قد يُحسب اثنين أو ثلاثة أو أكثر حسب المقياس. ولهذا بالضبط يؤدي العدّ اليدوي، أو الاعتماد على رقم واحد، إلى أخطاء برمجية.

أي عدّ ينبغي أن تستخدم؟

  • حدود الأحرف التي يراها الناس (نبذة تعريفية، حقل بأسلوب التغريدة، معاينة رسالة نصية): استخدم «الأحرف» (الوحدات الرسومية)، لأنها تطابق ما يعدّه المستخدم.
  • التعامل مع السلاسل في JavaScript أو الفهرسة أو التقطيع: استخدم وحدات UTF-16، فعليها تقوم ‎.length وفهارس السلسلة.
  • أحجام أعمدة قواعد البيانات: تحقّق مما إذا كان العمود يُقاس بالأحرف أم بالبايتات — فكثير منها محدود بالبايتات، وبايتات UTF-8 تختلف مجددًا عن كل هذه الأعداد.
  • عدّ الكلمات أو الأسطر للمحرّرات وسهولة القراءة: استخدم مقياسَي «الكلمات» و«الأسطر».

الأسئلة الشائعة

أي عدّ يطابق طول السلسلة في JavaScript؟
قيمة وحدات UTF-16 تطابق خاصية ‎.length الخام في JavaScript. إذا كان كودك يقطّع السلاسل أو يفهرسها، فهذا هو الرقم الذي يحكم سلوكه.
لماذا يُحسب رمز تعبيري واحد كعدة أحرف؟
كثير من الرموز التعبيرية مكوَّنة من عدة نقاط ترميز Unicode مدمجة معًا. كوحدة رسومية (ما تراه) هو حرف واحد، لكن أعداد نقاط الترميز وUTF-16 له أكبر، ولهذا يُعرض كل مقياس على حدة.
هل يحسب المسافات وفواصل الأسطر في النهاية؟
نعم. يُحسب كل حرف تلصقه، بما في ذلك المسافات في البداية والنهاية وفواصل الأسطر. إذا بدت المجاميع أكبر من المتوقع، فتحقّق من وجود مسافات نهائية غير مرئية.
هل يُرسَل نصي إلى أي مكان؟
لا. كل العدّ يجري في متصفحك. النص الذي تكتبه أو تلصقه لا يغادر جهازك أبدًا.
ما هي الوحدة الرسومية (grapheme)؟
الوحدة الرسومية، أو «عنقود الوحدات الرسومية»، هي حرف كما يدركه المستخدم — أصغر وحدة يسمّيها القارئ حرفًا واحدًا، حتى لو كانت مكوَّنة من عدة نقاط ترميز.
كيف تختلف البايتات عن هذه الأعداد؟
تعتمد البايتات على الترميز. في UTF-8، حرف ASCII بايت واحد، ومعظم الأحرف المشكَّلة وغير اللاتينية بايتان أو ثلاثة، وكثير من الرموز التعبيرية أربعة. لا شيء من المقاييس الخمسة هنا هو عدّ بايتات، لذا للحقول المحدودة بالبايتات رمّز إلى UTF-8 أولًا.