تهريب حقل CSV: الفواصل والأسطر الجديدة وعلامات الاقتباس
يبدو حقل CSV بسيطًا إلى أن تتضمن قيمته فاصلة أو سطرًا جديدًا أو علامة اقتباس. تطبق هذه الأداة قواعد التهريب القياسية على قيمة نصية واحدة كي تتمكنوا من إدراجها بأمان في صف تفصل بين حقوله الفواصل.
شغّل الأداة مجانًا
وهي تحافظ على النص العادي، وتحيط الحقول التي تحتاج إلى حماية بعلامتي اقتباس مزدوجتين، وتضاعف علامات الاقتباس الداخلية. تكون النتيجة حتمية وجاهزة لإعادة الاستخدام، وتناسب جداول البيانات وعمليات التصدير والتقارير المنشأة ومسارات معالجة البيانات.
حوّلوا أي نص إلى حقل CSV آمن
يستخدم تنسيق CSV الفواصل ونهايات الأسطر للفصل بين الحقول والسجلات، وهذا يسبب مشكلة عندما تكون تلك المحارف جزءًا من القيمة نفسها. ألصقوا قيمة نصية أو أرسلوها، وستعيد الأداة التمثيل الدقيق الذي يمكن أن يشغل موضعًا واحدًا في صف مفصول بالفواصل. تبقى القيمة البسيطة، مثل رمز الحساب، بلا تغيير. أما القيمة التي تتضمن فاصلة أو محرف إرجاع أو سطرًا جديدًا أو علامة اقتباس مزدوجة فتُحاط بعلامتي اقتباس مزدوجتين. تتحول كل علامة اقتباس مزدوجة موجودة داخل القيمة إلى علامتين متتاليتين، مما يتيح لقارئ CSV متوافق استعادة المحرف الأصلي. لا يغير التحويل إلا البنية اللازمة لسلامة CSV؛ فلا يحذف المسافات، ولا يوحّد نهايات الأسطر، ولا يعيد تفسير الأرقام، ولا يغير حالة الأحرف. يجعل هذا النطاق المحدد الأداة مكوّنًا موثوقًا عندما يتحكم التطبيق أصلًا في إنشاء الصفوف والأعمدة، لكنه يحتاج إلى قاعدة صحيحة قابلة لإعادة الاستخدام لكل قيمة منفردة. النص الفارغ صالح ويظل فارغًا لأنه لا يحتاج إلى إحاطة واقية في سجل قياسي تفصل بين حقوله الفواصل.
اعرفوا متى تلزم الإحاطة ومضاعفة علامات الاقتباس
التمييز المهم هو بين المحتوى وبنية CSV. يجب ألا تتحول الفاصلة داخل اسم شركة إلى عمود جديد، وألا يتحول السطر الجديد داخل عنوان إلى سجل جديد. إن إحاطة الحقل كاملًا بعلامتي اقتباس مزدوجتين تُعلم المحلل بأن هذه المحارف محتوى حرفي. وتحتاج علامات الاقتباس إلى قاعدة إضافية: داخل حقل CSV محاط بعلامات اقتباس، تُمثل كل علامة اقتباس حرفية بعلامتين. تكتشف الأداة كل هذه الحالات معًا. فإذا احتوى النص مثلًا على فاصلة واسم مستعار بين علامتي اقتباس، أضيف زوج خارجي من العلامات وضُوعفت كل علامة أصلية. يعاد النص الذي لا يحتوي على محرف بنيوي كما هو، فيتجنب التغييرات غير الضرورية مع بقائه صالحًا. يغطي السلوك أسطر Unix الجديدة ومحارف الإرجاع التي تستخدمها أنظمة أخرى. وهو يستهدف عمدًا CSV المفصول بالفواصل، لا المحددات القابلة للضبط؛ فإذا كان مسار العمل ينتج بيانات مفصولة بعلامات الجدولة أو الفواصل المنقوطة، فينبغي تطبيق قواعد التنسيق المقصود. المخرج حقل واحد، وليس صفًا أو ترويسة أو ملفًا كاملًا.
استخدموا القيمة المهرّبة في التصدير ومسارات المعالجة
ضعوا النص المعاد مباشرة بين الفواصل التي ينشئها مولد الصفوف، من دون إضافة طبقة أخرى من علامات الاقتباس. يتيح تطبيق العملية بصورة مستقلة على كل قيمة مصدر إنشاء صفوف من النماذج أو نتائج قواعد البيانات أو السجلات أو بيانات التقارير بسهولة. ولأن الخوارزمية حتمية ولا تعتمد على الشبكة، فإن الإدخال نفسه ينتج دائمًا الحقل المهرّب نفسه في المتصفح وعبر API. لذلك يسهل اختباره ببيانات ثابتة واستخدامه في عمليات بناء قابلة للتكرار. تجنبوا تمرير حقل سبق تهريبه مرة أخرى إلا إذا أصبح تمثيله المهرّب هو القيمة الحرفية الجديدة؛ فتهريب CSV يعتمد على السياق، وستعامل المرة الثانية بنية المرة الأولى باعتبارها محتوى وتضيف طبقة أخرى. وتذكروا أيضًا أن هذه القدرة تعالج بنية الحقل لا أمان صيغ جداول البيانات. إذا كان نص غير موثوق يبدأ مثلًا بعلامة المساواة سيُفتح في برنامج جداول بيانات، فقيّموا ضوابط حقن الصيغ بصورة منفصلة وفق سياسة التطبيق المستهدف. وأخيرًا، صِلوا الحقول المهرّبة بفواصل وأنهوا كل سجل بنهاية السطر التي يطلبها النظام المستقبِل.
حالات الاستخدام
أنشئوا تصدير CSV آمنًا
هرّبوا كل قيمة من قاعدة البيانات أو التطبيق قبل وصل الحقول الناتجة في سجل مفصول بالفواصل.
حافظوا على العناوين متعددة الأسطر
أبقوا الأسطر الجديدة المضمنة داخل حقل عنوان واحد بدل إنشاء سجلات CSV إضافية عن غير قصد.
احموا الأسماء والأوصاف
مثّلوا الفواصل وعلامات الاقتباس في أسماء المنتجات والملاحظات والأوصاف من دون إزاحة الأعمدة اللاحقة.
الأسئلة الشائعة
ما تكلفة الطلب الواحد؟
يكلف طلب API واحد $0.002. ويتوفر التحويل الحتمي نفسه مجانًا في المتصفح أيضًا.
هل تُحاط كل القيم بعلامات اقتباس؟
لا. تُحاط النتيجة إذا احتوى النص على فاصلة أو محرف إرجاع أو سطر جديد أو علامة اقتباس مزدوجة؛ وإلا أعيدت بلا تغيير.
كيف تُهرّب علامات الاقتباس؟
تتحول كل علامة اقتباس مزدوجة داخل الحقل إلى علامتين متتاليتين، ويحيط زوج آخر من العلامات بالحقل كاملًا.
هل تنشئ الأداة صف CSV كاملًا؟
لا. تعيد حقلًا مهرّبًا واحدًا. هرّبوا كل قيمة على حدة، ثم صِلوا النتائج بفواصل وأضيفوا نهاية السجل المناسبة.
هل تدعم القيم متعددة الأسطر؟
نعم. يُحاط النص الذي يتضمن محارف إرجاع أو أسطرًا جديدة كي تبقى تلك الفواصل داخل الحقل نفسه.
هل يمنع ذلك حقن الصيغ في جداول البيانات؟
لا. فهو يطبق بنية حقول CSV فقط. يعتمد تخفيف حقن الصيغ على الوجهة، ويجب تطبيقه بوصفه سياسة منفصلة.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/str/escape-csv-field \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Quarterly report, \"final\""}'const res = await fetch("https://api.kit.forhosting.com/str/escape-csv-field", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Quarterly report, \"final\""
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/escape-csv-field",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Quarterly report, \"final\""
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/escape-csv-field", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Quarterly report, \\"final\\""}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Quarterly report, \"final\""}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/escape-csv-field", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"text": "Quarterly report, \"final\""
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.escape_csv_field",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |