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