لماذا تتسبب علامات الاقتباس المنحنية في تعطيل الشيفرة وJSON وCSV

يشير الخطأ إلى سطر يبدو سليمًا تمامًا، لأن الفرق غير مرئي للوهلة الأولى.

علامات الاقتباس المنحنية (“ ” ‘ ’) محارف Unicode مختلفة عن علامات الاقتباس المستقيمة (" ') التي تتطلبها لغات البرمجة وصيغ البيانات. تطابق المحللات نقاط الترميز بدقة، فتكون علامة الاقتباس المنحنية مجرد حرف عادي بالنسبة إليها ولا تُفتَح السلسلة النصية أصلًا. استبدالها بعلامات اقتباس مستقيمة يحل المشكلة فورًا.

إنها محارف مختلفة فعلًا

هذه هي المشكلة كلها في جدول واحد:

المحرف الاسم نقطة الترميز
" علامة اقتباس مزدوجة مستقيمة U+0022
علامة اقتباس مزدوجة يسرى U+201C
علامة اقتباس مزدوجة يمنى U+201D
' فاصلة عليا مستقيمة U+0027
علامة اقتباس مفردة يسرى U+2018
علامة اقتباس مفردة يمنى U+2019

لغات البرمجة وJSON وCSV ومفسّرات سطر الأوامر لا تتعرف إلا على اثنين من هذه المحارف كمحددات للسلاسل النصية: U+0022 وU+0027. أما الأربعة الأخرى فهي محارف قابلة للطباعة عادية، في الفئة نفسها مع أي حرف أو فاصلة.

لذا عندما يصادف المحلل “name”، فهو لا يرى سلسلة نصية مقتبسة بعلامات مزخرفة قليلًا، بل يرى تسلسلًا غير مقتبس من المحارف يبدأ برمز لم يتوقعه. تقول رسالة الخطأ شيئًا مثل unexpected token وتشير إلى سطر يبدو صحيحًا تمامًا، لأن الفرق بين " و“ بأحجام الخطوط العادية لا يتجاوز بضع بكسلات من الانحناء.

ملصوق من المحادثة{ name: Ada }SyntaxError: Unexpected token '“'بعد التوحيد{ "name": "Ada" }
علامات الاقتباس المنحنية محارف مختلفة عن العلامات المستقيمة التي تتوقعها المحللات.

من أين تأتي

تأتي دائمًا تقريبًا من برنامج يحاول مساعدتك.

  • Word وGoogle Docs يحوّلان علامات الاقتباس المستقيمة إلى منحنية أثناء الكتابة. هذه الميزة مفعّلة افتراضيًا ومعظم الناس لا يلاحظونها، لأنها في النثر هي ما تريده بالضبط.
  • نماذج المحادثة تنتجها لأنها تعلمت من نصوص منشورة مضبوطة طباعيًا بعلامات اقتباس صحيحة.
  • macOS يطبق الاستبدال الذكي على مستوى النظام في كثير من حقول النص.
  • محررات أنظمة إدارة المحتوى وصناديق التعليقات تُجري كثيرًا منها مرشحات طباعية على النص المرسل.
  • النسخ واللصق من PDF ينقل ما استخدمه المُصفِّف، وهو في أي مستند منسق باحتراف علامات منحنية.

الخيط المشترك هو أن النص مرّ عبر شيء مصمم للقراءة في طريقه إلى شيء مصمم للتحليل. النثر يريد علامات اقتباس طباعية، والشيفرة تريد بايتات دقيقة. المشكلة تحدث عند الحد الفاصل.

وينطبق الأمر نفسه على بعض المرافقين الجديرين بالمعرفة: محرف الحذف (…) بدلًا من ثلاث نقاط، والشرطات القصيرة والطويلة بدلًا من الواصلة، والمسافات غير الفاصلة بدلًا من المسافات العادية. كل منها نقطة ترميز مختلفة عن محرف ASCII الذي يشبهها، وكل منها يعطّل المحلل بالطريقة الصامتة نفسها.

ما الذي يتعطل تحديدًا

JSON. يجب أن تستخدم كل سلسلة نصية في JSON المحرف U+0022. علامة اقتباس منحنية واحدة تجعل المستند غير صالح، ولأن المحللات تبلّغ عن أول خطأ فقط، فإن ملفًا يحوي العشرات منها يحتاج عدة جولات لإصلاحه يدويًا. اللصق في أداة تنسيق JSON والتحقق منه يعرض الموضع الدقيق لأول مخالفة.

CSV. قواعد الاقتباس موجودة لحماية الحقول المحتوية على فواصل. علامة الاقتباس المنحنية ليست محرف اقتباس، لذا فحقل مثل “Smith, John” ينقسم عند الفاصلة وينزاح كل عمود لاحق بمقدار واحد. هذه الحالة أسوأ من خطأ بناء الجملة لأنها تفشل بصمت — تحصل على ملف يُستورَد من دون اعتراض وهو خاطئ.

الشيفرة المصدرية. في معظم اللغات يكون هذا خطأ ترجمة أو تحليل، وهو على الأقل واضح. أما في سكربتات سطر الأوامر فقد يكون أسوأ: rm –rf بشرطة قصيرة بدلًا من واصلة ليس الخيار الذي قصدته، والوسائط المقتبسة بعلامات منحنية تُمرَّر كنص حرفي.

ملفات الإعداد. ملفات YAML وTOML و.env تقبل علامات الاقتباس المنحنية بصمت كجزء من القيمة. فينتهي مفتاح API الخاص بك بمحرف زخرفي ملتصق به، ويفشل التوثيق، ولا يخبرك شيء في السجل بالسبب.

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

كيف تُصلح المشكلة بشكل صحيح

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

أوقف المصدر. إذا تكررت المشكلة، عطّل الاستبدال:

  • Word: ملف ← خيارات ← تدقيق ← خيارات التصحيح التلقائي ← تنسيق تلقائي أثناء الكتابة ← ألغِ تحديد "علامات اقتباس مستقيمة بعلامات اقتباس ذكية".
  • Google Docs: أدوات ← التفضيلات ← ألغِ تحديد "استخدام علامات الاقتباس الذكية".
  • macOS: إعدادات النظام ← لوحة المفاتيح ← إدخال النص ← تحرير ← أوقف علامات الاقتباس والشرطات الذكية.

لا تكتب الشيفرة في معالج نصوص. الحل الحقيقي بنيوي. أي نص مُوجَّه إلى محلل يجب أن يُكتب في محرر نص عادي، فهو لن يعيد كتابة محارفك أبدًا.

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

إذا استمر فشل الملف بعد توحيد علامات الاقتباس، فالمشتبه به التالي هو محرف غير مرئي؛ راجع مرجع محارف Unicode غير المرئية.

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

لماذا يقول ملف JSON إن هناك unexpected token رغم أنه يبدو صحيحًا؟

السبب دائمًا تقريبًا علامة اقتباس منحنية في موضع يفترض أن يكون فيه علامة مستقيمة. يتطلب JSON المحرف U+0022 تحديدًا، والمتغيران المنحنيان U+201C وU+201D محرفان عاديان بالنسبة إلى المحلل. الفرق لا يتجاوز بضع بكسلات على الشاشة، ولهذا يبدو السطر سليمًا.

ما الفرق بين علامات الاقتباس المنحنية والمستقيمة؟

هما محارف Unicode مختلفة. العلامات المستقيمة هي U+0022 وU+0027، وهما محرفا ASCII اللذان يتوقعهما كل محلل. أما العلامات المنحنية فهي U+2018 وU+2019 وU+201C وU+201D — علامات طباعية تنحني نحو النص، صحيحة في النثر وغير صالحة كمحددات للسلاسل النصية.

كيف أحوّل علامات الاقتباس المنحنية إلى مستقيمة؟

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

لماذا تنزاح الأعمدة عند استيراد ملف CSV؟

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

هل يجب أن أزيل علامات الاقتباس المنحنية دائمًا؟

لا. في النثر هي تنسيق طباعي صحيح وتبدو أفضل من العلامات المستقيمة. وحّدها فقط عندما يعبر النص إلى شيفرة أو JSON أو CSV أو ملفات إعداد أو أي شيء آخر سيُحلَّل لا أن يُقرأ.

الأدوات المذكورة في هذا الدليل

أدلة ذات صلة