طول النص: الأحرف والبايتات والرموز المرئية
اسأل ثلاث أدوات كم طول هذا النص وقد تحصل على ثلاث إجابات مختلفة — وكلها صحيحة. واحدة تعد ما تراه، وواحدة تعد التخزين، وواحدة تعد السباكة الخفية تحتها. للنص الإنجليزي البسيط تتفق، لهذا لا يظهر الفرق إلا في أسوأ لحظة: سيرة مليئة بالإيموجي ترفضها قاعدة البيانات، أو تشكيل واحد يضاعف فاتورة SMS. يمكنك عد الأحرف والبايتات في المتصفح، أو تابع القراءة لتعرف لماذا تختلف الأرقام.

نُشر في 20 سبتمبر 2026
هناك ثلاث إجابات شائعة لسؤال «كم طول هذا النص»، وكل واحدة تقيس شيئا مختلفا. البايتات تقيس التخزين: كم وحدة 8-بت يشغلها النص في ترميز معين. نقاط الكود تقيس قيم يونكود: كم مدخلا مرقما يستخدمه النص. الرموز المرئية تقيس الإدراك: كم حرفا يراه القارئ البشري.
خذ كلمة مقهى. القارئ يرى 4 رموز مرئية. في صيغتها المركبة هي 4 نقاط كود، لكنها في UTF-8 تشغل 8 بايتات لأن كل حرف عربي يحتاج بايتين. وخذ علم إيموجي: رمز مرئي واحد للمستخدم، ونقطتا كود في الخلفية، و8 بايتات في UTF-8، و4 وحدات كود UTF-16. النص نفسه، وأربعة أرقام.
حقيقتان تفسران كل علل الطول تقريبا. الأولى أن العدادات الساذجة تختار وحدة واحدة وتتظاهر أنها الثلاث معا — خاصية .length في JavaScript تعد وحدات UTF-16، ودالة strlen في C تعد البايتات، ولا واحدة منهما هي «ال» طول. والثانية أن الحدود تختار وحدتها الخاصة — عمود قاعدة بيانات يعد الأحرف، وحمولة API تعد البايتات، وSMS يعد الرموز المشفرة — والعلة دائما عدم تطابق بين العداد والحد.
بقية هذا المقال تغطي الوحدات الثلاث بالتفصيل، ولماذا يكسر الإيموجي والتشكيل العدّادات الساذجة، وحسابات UTF-8 مقابل UTF-16، والحدود العملية التي ترفض نصك فعلا، ومتى تتحقق بالأحرف ومتى بالبايتات، وما الذي يتغير مع العربية والنص ثنائي الاتجاه. وإن احتجت الأرقام فقط فإن أداة طول النص تعرض الأحرف والكلمات والبايتات جنبا إلى جنب. وهي جزء من مجموعة أدوات النصوص الأوسع إلى جانب عدّاد الكلمات.
الأحرف والبايتات والرموز المرئية — مع أمثلة
مطبقة على النصوص نفسها، هذا ما تبلغ عنه كل وحدة وأي أداة أو حد يستخدمها:
| النص | الرموز المرئية | بايتات UTF-8 | JS .length (وحدات UTF-16) |
|---|---|---|---|
hello | 5 | 5 | 5 — الثلاث متفقة على ASCII |
مقهى | 4 | 8 | 4 |
😀 | 1 | 4 | 2 (زوج بديل) |
ب + ً (تنوين مفكك) | 1 | 4 | 2 |
إيموجي عائلة 👨👩👧 | 1 | 18+ | 8+ (سلسلة روابط) |
النمط: النص ASCII يجعل كل العدادات متفقة، لهذا تختبئ الفروق حتى يصل النص الحقيقي — التشكيل والإيموجي والكتابات غير اللاتينية. اختبر عدادك بالنص مقهى 😀 وستعرف فورا أي وحدة يبلغ عنها.
لماذا يكسر الإيموجي والتشكيل العدّادات الساذجة
آليتان تسببان كل المفاجآت تقريبا. الأولى الأحرف متعددة البايتات: في UTF-8 تأخذ الحروف ASCII بايتا واحدا، واللاتينية المشكولة بايتين، ومعظم الكتابات غير اللاتينية 2–3، والإيموجي 4. فأي عداد يبلغ عن البايتات ينمو أسرع من النص المرئي فور مغادرة الإنجليزية البسيطة.
والثانية التسلسلات المركبة: أحرف مبنية من عدة نقاط كود تظهر كصورة واحدة. الحرف المشكول قد يكون نقطة كود مركبة أو الحرف مع علامة تشكيل مدمجة — متطابقان على الشاشة ومختلفان في العد. والإيموجي أسوأ: الأعلام أزواج مؤشرات إقليمية، والعائلات سلاسل كاملة مربوطة بواصلات صفرية العرض. «الحرف» المرئي الواحد قد يكون ثماني نقاط كود.
- خاصية
.lengthفي JavaScript تعد وحدات كود UTF-16. كل ما خارج المستوى الأساسي — كل الإيموجي تقريبا — يعد 2. استخدمArray.from(str).lengthلنقاط الكود أوIntl.Segmenterللرموز المرئية. - دالة
len()في Python تعد نقاط الكود. أفضل، لكنها ليست الرموز المرئية: العلم يبلغ 2، والعائلة بالواصلات 7+. - التطبيع يغير العد. صيغتا NFC (مركبة) وNFD (مفككة) للكلمة نفسها لهما عددا نقاط كود مختلفين. قاعدتا بيانات تخزنان الاسم نفسه بصيغتين مختلفتين تختلفان على طوله.
الحل ليس رقما واحدا أفضل — بل الرقم الصحيح للمهمة، لهذا تعرض أداة طول النص الأحرف والكلمات وبايتات UTF-8 معا بدلا من التظاهر أن أحدها هو «ال» طول.
حسابات البايت في UTF-8 مقابل UTF-16
ترميزات التخزين تحول نقاط الكود نفسها إلى أعداد بايتات مختلفة. UTF-8 يستخدم بايتا واحدا لـASCII، وبايتين للاتينية المشكولة واليونانية والسيريلية والعبرية والعربية، و3 لمعظم الكتابات الآسيوية، و4 للإيموجي. وUTF-16 يستخدم بايتين لكل المستوى الأساسي و4 بايتات (زوج بديل) لكل ما خارجه.
النتيجة العملية: الوصف الفرنسي بنفس الحجم تقريبا في الترميزين، والكتالوج العربي كذلك، لكن السيرة الاجتماعية المليئة بالإيموجي أكبر في UTF-8 (4 بايتات لكل إيموجي) مما يوحي به .length في JavaScript (وحدتان لكل إيموجي).
للمطورين التحويلات سطر واحد: new TextEncoder().encode(str).length يعطي بايتات UTF-8 في المتصفح، وlen(s.encode("utf-8")) في Python، وBuffer.byteLength(str, "utf8") في Node.js. حين توثق واجهة حدا بالبايتات فهذا هو الرقم الذي يجب فحصه — لا رقم عداد الأحرف في حقل الإدخال.
الحدود التي ترفض نصك فعلا
لا يهم الطول إلا لأن شيئا ما يفرضه. الحدود الأربع التي تعض غالبا:
- أعمدة قواعد البيانات. حد
VARCHAR(255)عادة بالأحرف، لكن الأنواع المحدودة بالبايتات وأعمدة MySQL القديمةutf8(3 بايتات) ترفض إيموجي الـ4 بايتات تماما. يظهر الخطأ عند الإرسال بعد اجتياز المستخدم تحقق الواجهة بزمن طويل. - تقطيع SMS. 160 حرف GSM-7 للمقطع، أو 70 بترميز UCS-2 فور ظهور حرف خارج الأبجدية — ثم 153/67 للمقطع المركب بعد الأول. إيموجي واحد قد يحول رسالة من مقطع واحد إلى 3.
- حدود حقول API. كثير من الواجهات تحد الحقول بالبايتات (حدود الحمولة) بينما توثقها بالأحرف. حقل موثق «32 حرفا» قد يرفض 32 إيموجي لتجاوز ميزانية البايتات تحته.
- التحقق في النماذج. خاصية
maxlengthفي الواجهة تعد وحدات UTF-16 في معظم المتصفحات — فتتفق مع.lengthفي JavaScript لكن لا مع الخادم ولا قاعدة البيانات ولا عيني المستخدم.
القاعدة: اكتشف أي وحدة تعدها الطبقة التي تفرض الحد، وتحقق بتلك الوحدة. وحين تصمت الوثائق اختبر بالإيموجي — فهي تفصل عدادات الأحرف عن عدادات البايتات أسرع من أي توثيق.
متى تتحقق بالأحرف ومتى بالبايتات
تحقق بالرموز المرئية أو نقاط الكود حين يكون الحد عن محتوى بشري: أسماء العرض والسير والعناوين والتعليقات وأوصاف الميتا. المستخدم يفكر بالأحرف المرئية فينبغي للعداد ذلك أيضا.
تحقق بالبايتات حين يكون الحد عن النقل أو التخزين: حدود حمولات الطلبات، والأعمدة المحدودة بالبايتات، وحدود أحجام webhooks، وطول الروابط المشفرة. هنا الطول المرئي لا يهم — ما يهم هو ما يعبر السلك.
وتحقق دائما في الطرفين بالوحدة نفسها. واجهة تعد الرموز المرئية بينما يعد الخادم البايتات هي الشكل الأكثر شيوعا لهذه العلة، ولا تظهر إلا مع مدخلات غير ASCII — وهي بالضبط ما تفتقده مجموعة اختباراتك غالبا.
النص العربي والمحارف ثنائية الاتجاه
العربية تضيف تعقيدين. الأول التشكيل (الحركات): الكلمة المرئية نفسها قد تخزن بالحركات أو بدونها، ومركبة أو مفككة، فتبلغ سلسلتان «متطابقتان» عن طولين مختلفين. التطبيع إلى NFC قبل العد يزيل معظم الخلاف.
والثاني الاتجاهية: النص المختلط عربي ولاتيني يحوي محارف تحكم ثنائية الاتجاه خفية تؤثر في ترتيب العرض. هي خفية عن الشاشة لكنها تعد في كل الوحدات — البايتات ونقاط الكود وطول UTF-16، كلها. عنوان منتج منسوخ «يبدو» 30 حرفا قد يكون 34 بسبب علامتين خفيتين.
الكتابة العربية نفسها بلا أحرف كبيرة وصغيرة، فمحولات الحالة لا تعمل عليها — لكن عدادات الطول تعاملها كأي كتابة غير لاتينية: بايتان لكل حرف في UTF-8 ووحدة UTF-16 واحدة لكل حرف. النص العربي الملصق الذي يفشل في حد يفشل عادة في البايتات لا في الطول المرئي.
عد دون تخمين
أيا كان الحد الذي تتحقق منه، ينبغي أن يكون العد على بعد لصقة واحدة:
- عداد طول نص مجاني يعرض الأحرف والكلمات وبايتات UTF-8 جنبا إلى جنب.
- يعمل بالكامل في متصفحك — لا يرفع شيء مما تلصقه.
- يقترن مع عدّاد الكلمات حين تحتاج الكلمات وزمن القراءة أيضا.
- جزء من مجموعة أدوات النصوص الأوسع: عدّاد كلمات ومحوّل حالة ومرمّز روابط ومرمّز Base64.
الأسئلة الشائعة
ما الفرق بين الأحرف والبايتات والرموز المرئية؟▾
البايت وحدة تخزين، ونقطة الكود قيمة يونكود مرقمة، والرمز المرئي (grapheme) هو ما يدركه الإنسان كحرف واحد. كلمة "مقهى" أربعة رموز مرئية وأربعة نقاط كود في صيغة NFC لكنها 8 بايتات في UTF-8 لأن كل حرف عربي يحتاج بايتين. علم الإيموجي قد يكون رمزا مرئيا واحدا مبنيا من نقطتي كود و8 بايتات. الرقم الذي تريده يعتمد على السؤال: العرض يحتاج الرموز المرئية، والتخزين وحدود API تحتاج البايتات.
لماذا يعطي .length في JavaScript إجابة خاطئة مع الإيموجي؟▾
لأن سلاسل JavaScript وحدات كود UTF-16، و.length يعد تلك الوحدات لا الأحرف. معظم الإيموجي يعيش خارج المستوى متعدد اللغات الأساسي، فيحتاج كل واحد وحدتي UTF-16 (زوج بديل) ويبلغ .length عن 2 لإيموجي مرئي واحد. استخدم Array.from(str).length لنقاط الكود، أو Intl.Segmenter بدقة grapheme لما يراه المستخدم فعلا.
هل أتحقق من النماذج بالأحرف أم بالبايتات؟▾
تحقق بنفس الوحدة التي يفرضها الخادم. إن كان العمود VARCHAR(255) فالحد عادة بالأحرف، فعد الرموز المرئية أو نقاط الكود في الواجهة. وإن كان العمود نوعا محدودا بالبايتات أو كانت الواجهة توثق حدا بالبايتات، فعد بايتات UTF-8 بدلا من ذلك. العلة الكلاسيكية هي واجهة تعد الأحرف بينما يعد الخادم البايتات: سيرة مليئة بالإيموجي تجتاز التحقق في المتصفح ثم تفشل بخطأ قاعدة بيانات عند الإرسال.
كم حرفا في مقطع SMS واحد؟▾
المقطع الواحد يتسع لـ160 حرفا بأبجدية GSM-7 (لاتينية أساسية وأرقام وبعض الرموز) أو 70 حرفا بترميز UCS-2 الذي يستخدم فور احتواء الرسالة أي حرف خارج GSM-7 مثل النص العربي أو الإيموجي. الرسائل الأطول تقسم إلى مقاطع مركبة من 153 حرف GSM-7 أو 67 حرف UCS-2 لكل مقطع. إيموجي واحد في رسالة بسيطة قد يحول الرسالة كلها إلى UCS-2 ويضاعف عدد المقاطع ثلاث مرات.
لماذا يختلف طول النص العربي نفسه بين الأدوات؟▾
عادة بسبب التطبيع (normalization) وبسبب ما تعده كل أداة. الحروف العربية مع التشكيل (الحركات) قد تخزن مركبة أو مفككة، فالكلمة المرئية نفسها لها أعداد نقاط كود مختلفة. بعض الأدوات تعد وحدات كود UTF-16 وبعضها نقاط الكود وبعضها الرموز المرئية، وحرف التحكم ثنائي الاتجاه الخفي عن الشاشة يعد في كل الوحدات. قارن الأدوات بالتحقق هل تطبع المدخل أولا وأي وحدة تبلغ عنها.
كيف أعد طول النص بشكل صحيح؟▾
حدد أي وحدة يستخدمها حدك ثم استخدم الطريقة المطابقة. لما يراه المستخدم استخدم التقطيع إلى رموز مرئية (Intl.Segmenter في المتصفح). لحدود البايتات في التخزين أو API رمّز إلى UTF-8 وعد البايتات (TextEncoder في JavaScript وlen(s.encode utf-8) في Python). ولتحقق سريع الصق النص في أداة طول النص من RMBG.PRO التي تعرض الأحرف والكلمات وبايتات UTF-8 جنبا إلى جنب دون رفع أي شيء.
Similar articles
View all
Work with permitted TikTok content using RMBG.PRO. Check public TikTok links, convert videos to MP4 or WebM, extract MP3 or WAV audio, and choose quality presets.

Travaillez avec du contenu TikTok autorisé grâce à RMBG.PRO. Vérifiez les liens publics, convertissez en MP4 ou WebM, extrayez l’audio MP3 ou WAV et choisissez la qualité.

Trabaja con contenido TikTok permitido en RMBG.PRO. Revisa enlaces públicos, convierte a MP4 o WebM, extrae audio MP3 o WAV y elige la calidad.