المسافات المخفية في النص: لماذا يفشل البحث والنسخ رغم أن النص يبدو طبيعيًا؟

قد يفشل البحث أو إزالة التكرار لأن النص يحتوي محرفًا غير مرئي. دليل عملي يشرح NBSP وZERO WIDTH SPACE وعلامات الاتجاه وطريقة تنظيف النص دون إفساده.

النصوص · تشخيص مشكلة غير مرئية

المسافات المخفية في النص: لماذا يفشل البحث والنسخ رغم أن النص يبدو طبيعيًا؟

قد ترى كلمتين متطابقتين حرفًا بحرف، بينما برنامج البحث أو إزالة التكرار يراهما مختلفتين. السبب أحيانًا ليس في الكلمة نفسها، بل في محرف غير مرئي انتقل معها من PDF أو صفحة ويب أو جدول بيانات.

عبد الكريم مرجاني آخر تحديث: سبتمبر 2026 دليل تقني مبسّط
البحث لا يجد النصتنسخ العبارة نفسها، لكن النتيجة لا تظهر.
التكرار لا يُحذفسطران متشابهان بصريًا يبقيان كقيمتين منفصلتين.
الفرز أو المطابقة يتصرفان بغرابةالاختلاف موجود في البيانات، لا في الشكل الذي تراه.

ابدأ بهذه الملاحظة: ما تراه ليس دائمًا ما يقرأه النظام

اكتب اسمًا يدويًا داخل مربع بحث، ثم انسخ الاسم نفسه من ملف PDF أو صفحة ويب. إذا نجحت النسخة المكتوبة وفشلت المنسوخة، لا تتهم البحث مباشرة. قارن السلسلتين على مستوى المحارف. قد تكون المسافة بين الكلمتين في الأولى هي U+0020 العادية، بينما في الثانية U+00A0 — مسافة غير قابلة للكسر تبدو شبه مطابقة في الشاشة.

معاينة بصريةما يهم فعليًا: رمز المحرف
محمد عليU+0020 SPACEمسافة عادية
محمد عليU+00A0 NO-BREAK SPACEشكل قريب، قيمة مختلفة
محمد​عليU+200B ZERO WIDTH SPACEقد لا ترى فاصلًا أصلًا

المقارنة الحرفية لا تسأل: «هل النصان يبدوان متشابهين؟». هي تقارن القيم المخزنة. لذلك يستطيع محرف واحد غير مرئي أن يكسر بحثًا حرفيًا، أو يجعل نظامًا يعتبر سجلين قيمتين مختلفتين، أو يفشل شرط المطابقة في برنامج صغير.

ليس كل «فراغ» مسافة عادية

Unicode يضم أكثر من نوع من محارف المسافات والتنسيق. بعضها له عرض مرئي، وبعضها بلا عرض، وبعضها موجود فقط للتحكم في كسر السطر أو اتجاه النص. جمعها كلها تحت اسم «مسافات مخفية» مفيد في الكلام اليومي، لكنه غير دقيق تقنيًا.

U+0020SPACE

المسافة المعتادة التي تدخلها غالبًا من لوحة المفاتيح.

U+00A0NO-BREAK SPACE

لها عرض مشابه للمسافة العادية، لكنها تمنع كسر السطر في الموضع نفسه في الظروف المعتادة.

U+200BZERO WIDTH SPACE

لا تملك عرضًا مرئيًا، ويمكن أن تؤثر في تقسيم الكلمات أو مواضع كسر السطر.

U+2060WORD JOINER

محرف بلا عرض يستخدم لمنع كسر السطر بين ما يجاوره.

U+200E / U+200FLRM / RLM

علامات اتجاه تستخدم عند مزج نص من اليمين إلى اليسار مع أرقام أو نص لاتيني. حذفها عشوائيًا قد يغيّر العرض.

نص يبدو متطابقًا لكنه يحتوي محارف ومسافات مخفية
العين تقارن الشكل؛ البرامج قد تقارن تسلسل المحارف نفسه.

كيف وصلت هذه المحارف إلى النص أصلًا؟

في أغلب الحالات لم يكتب المستخدم المحرف الغريب عمدًا. هو جاء مع النص أثناء النسخ. وهنا تختلف المصادر:

  • صفحات الويب

    قد تستخدم NBSP للحفاظ على كلمتين أو رقم ووحدة في السطر نفسه. عندما تنسخ النص، قد تنتقل المسافة كما هي.

  • ملفات PDF

    PDF مصمم أساسًا لحفظ شكل الصفحة. طبقة النص داخله قد تعكس قرارات تنسيق أو تقسيم مختلفة عن الفقرة التي تراها. النسخ قد يحمل تلك التفاصيل إلى محرر آخر.

  • الجداول والأنظمة الإدارية

    بيانات انتقلت بين Excel وCSV ونظام ويب ثم عادت قد تحمل مسافات طرفية أو محارف تنسيق لم تكن واضحة في أي مرحلة.

  • النص المختلط عربيًا ولاتينيًا

    علامات الاتجاه قد تدخل لضبط عرض رقم أو رابط أو اسم لاتيني داخل جملة عربية. وجودها ليس خطأ تلقائيًا.

فكرة تستحق الحذر: «غير مرئي» لا تعني «غير مفيد». بعض محارف التنسيق موجودة لسبب. حذف كل ما لا تراه دفعة واحدة يمكن أن يصلح سطرًا ويكسر سطرًا آخر.

Unicode Normalization يحل مشكلة مختلفة

كلمة «تطبيع» تُستخدم كثيرًا وكأنها زر تنظيف شامل. هذا ليس ما تفعله Unicode Normalization. الفكرة الأساسية هي توحيد تمثيلات تعتبر مكافئة لنفس النص؛ مثل حالات يكون فيها المحرف متاحًا بصورة مركبة أو كسلسلة من محرف أساسي وعلامة مضافة.

أشكال NFC وNFD تتعامل مع التكافؤ القانوني للمحارف. أما NFKC وNFKD فتتوسع إلى توافقات أخرى وقد تُسقط فروقًا شكلية أو دلالية فرعية؛ ولهذا لا ينبغي استخدامها على بيانات حساسة بلا فهم لما ستغيره. توصي مواد Unicode باستخدام NFC بشكل شائع للنص العام، بينما قد تكون NFKC أنسب في مجالات محددة مثل المعرّفات.

لكن التطبيع لا يعني أن NBSP ستتحول تلقائيًا إلى SPACE في كل حالة، ولا أنه سيحذف ZERO WIDTH SPACE أو علامات الاتجاه لمجرد أنها غير مرئية. إذا كانت المشكلة محرفًا بعينه، عالج ذلك المحرف بعينه.

متى يكون التطبيع منطقيًا؟

  • عند مقارنة نصوص قد تحتوي تمثيلات Unicode مكافئة للمحرف نفسه.
  • عند بناء نظام يبحث أو يطابق نصوصًا قادمة من مصادر متعددة.
  • بعد تحديد نوع البيانات وما إذا كانت فروق التوافق مهمة أم لا.

طريقة تنظيف لا تبدأ بمحو كل شيء

أسرع طريقة ليست دائمًا استبدال جميع المسافات أو حذف كل محرف صفري العرض. خذ عينة صغيرة أولًا. إذا فهمت العطل على سطر واحد، تستطيع إصلاح آلاف السطور بثقة أكبر.

وإذا كان النص عربيًا وتفكر في إزالة التشكيل أو التطويل إلى جانب المسافات، فراجع أولًا دليل تنظيف النص العربي؛ لأن هذه التغييرات ليست كلها من النوع نفسه، وبعضها يغيّر النص الذي تريد الاحتفاظ به.

  1. اعزل مثالًا واحدًا يفشل.اختر كلمة أو سطرًا يمكن إعادة اختبار المشكلة عليه بسرعة.
  2. اصنع نسخة مرجعية يدويًا.اكتب النص نفسه من لوحة المفاتيح بدل نسخه، ثم قارن النتيجتين.
  3. افحص code points أو نوع المسافة.الهدف معرفة المحرف المختلف، لا مجرد ملاحظة أن هناك «شيئًا غريبًا».
  4. نفّذ استبدالًا محدودًا.إذا كانت المشكلة NBSP مثلًا، استبدل NBSP تحديدًا داخل نسخة من البيانات.
  5. أعد الاختبار قبل المعالجة الجماعية.تأكد أن البحث والمطابقة والفرز أصبحت تعمل، وأن تنسيق النص العربي لم يتضرر.

وماذا عن trim؟

إزالة المسافات من بداية السطر ونهايته مفيدة عندما تكون المشكلة فعلًا مسافات طرفية، لكنها لن تصلح تلقائيًا كل محارف Unicode غير المرئية. وحتى سلوك trim يختلف باختلاف اللغة البرمجية أو الأداة. افحص ما تعتبره الأداة «مسافة» قبل الاعتماد عليها لمعالجة ملف كبير.

إذا كان النص عربيًا مع أرقام أو روابط

لا تحذف LRM وRLM أو غيرهما من محارف الاتجاه لمجرد أنك لا تراها. هذه العلامات قد تكون السبب في ظهور الرقم أو الرابط في مكانه الصحيح. إذا كان الخلل في البحث وليس في العرض، افصل بين «نسخة للعرض» و«نسخة للمقارنة» بدل تدمير معلومات التنسيق في النص الأصلي.

جرّب على نسخة من النص أولًا

أدوات النصوص في تولاتي مناسبة للتجارب الصغيرة قبل تعديل الملف الأصلي أو مجموعة كبيرة من البيانات.

فتح أدوات النصوص

المصادر التقنية

اعتمد هذا الدليل على مواصفات Unicode نفسها لتحديد وظائف المحارف والتطبيع، وليس على قوائم مختصرة من مواقع ثانوية.

Unicode Core
Unicode 18.0 — Chapter 23يوضح NO-BREAK SPACE وZERO WIDTH SPACE وWORD JOINER ومحارف تنسيق أخرى.
فتح المرجع
UAX #15
Unicode Normalization Formsالمرجع الرسمي لأشكال NFC وNFD وNFKC وNFKD وكيفية التعامل مع التمثيلات المكافئة.
فتح المرجع
UAX #14
Unicode Line Breaking Algorithmيوثق سلوك محارف مثل WORD JOINER وNO-BREAK SPACE في منع أو السماح بكسر السطر.
فتح المرجع