المسافات المخفية في النص: لماذا يفشل البحث والنسخ رغم أن النص يبدو طبيعيًا؟
قد ترى كلمتين متطابقتين حرفًا بحرف، بينما برنامج البحث أو إزالة التكرار يراهما مختلفتين. السبب أحيانًا ليس في الكلمة نفسها، بل في محرف غير مرئي انتقل معها من PDF أو صفحة ويب أو جدول بيانات.
ابدأ بهذه الملاحظة: ما تراه ليس دائمًا ما يقرأه النظام
اكتب اسمًا يدويًا داخل مربع بحث، ثم انسخ الاسم نفسه من ملف 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 مكافئة للمحرف نفسه.
- عند بناء نظام يبحث أو يطابق نصوصًا قادمة من مصادر متعددة.
- بعد تحديد نوع البيانات وما إذا كانت فروق التوافق مهمة أم لا.
طريقة تنظيف لا تبدأ بمحو كل شيء
أسرع طريقة ليست دائمًا استبدال جميع المسافات أو حذف كل محرف صفري العرض. خذ عينة صغيرة أولًا. إذا فهمت العطل على سطر واحد، تستطيع إصلاح آلاف السطور بثقة أكبر.
وإذا كان النص عربيًا وتفكر في إزالة التشكيل أو التطويل إلى جانب المسافات، فراجع أولًا دليل تنظيف النص العربي؛ لأن هذه التغييرات ليست كلها من النوع نفسه، وبعضها يغيّر النص الذي تريد الاحتفاظ به.
- اعزل مثالًا واحدًا يفشل.اختر كلمة أو سطرًا يمكن إعادة اختبار المشكلة عليه بسرعة.
- اصنع نسخة مرجعية يدويًا.اكتب النص نفسه من لوحة المفاتيح بدل نسخه، ثم قارن النتيجتين.
- افحص code points أو نوع المسافة.الهدف معرفة المحرف المختلف، لا مجرد ملاحظة أن هناك «شيئًا غريبًا».
- نفّذ استبدالًا محدودًا.إذا كانت المشكلة NBSP مثلًا، استبدل NBSP تحديدًا داخل نسخة من البيانات.
- أعد الاختبار قبل المعالجة الجماعية.تأكد أن البحث والمطابقة والفرز أصبحت تعمل، وأن تنسيق النص العربي لم يتضرر.
وماذا عن trim؟
إزالة المسافات من بداية السطر ونهايته مفيدة عندما تكون المشكلة فعلًا مسافات طرفية، لكنها لن تصلح تلقائيًا كل محارف Unicode غير المرئية. وحتى سلوك trim يختلف باختلاف اللغة البرمجية أو الأداة. افحص ما تعتبره الأداة «مسافة» قبل الاعتماد عليها لمعالجة ملف كبير.
إذا كان النص عربيًا مع أرقام أو روابط
لا تحذف LRM وRLM أو غيرهما من محارف الاتجاه لمجرد أنك لا تراها. هذه العلامات قد تكون السبب في ظهور الرقم أو الرابط في مكانه الصحيح. إذا كان الخلل في البحث وليس في العرض، افصل بين «نسخة للعرض» و«نسخة للمقارنة» بدل تدمير معلومات التنسيق في النص الأصلي.
جرّب على نسخة من النص أولًا
أدوات النصوص في تولاتي مناسبة للتجارب الصغيرة قبل تعديل الملف الأصلي أو مجموعة كبيرة من البيانات.
المصادر التقنية
اعتمد هذا الدليل على مواصفات Unicode نفسها لتحديد وظائف المحارف والتطبيع، وليس على قوائم مختصرة من مواقع ثانوية.
