صيغة حفظ ملفات متعددة المنصات، أأجعل نظام السطور CRLF أم LF؟

السلام عليكم ورحمة الله وبركاته.

أعمل على خوارزمية لصيغة جديدة للملفات لبرنامج متعدد المنصات عملت عليه لمدة طويلة، بعدما اخترتُ أخيرًا UTF-8 بدلًا من UTF-16 كترميز ثابت لهذه الصيغة، احترتُ بين CRLF أو LF للسطور الجديدة، من المنطقي أن يكون Byte واحد أفضل من اثنين(توفيرًا للذاكرة) لكن أتوفير Byte لكل سطر حقًا توفير! أأتبع LF كما UNIX أم CRLF كما ويندوز، ولم أفهم لما يستخدمون CRLF بعيدًا عن استخدامها لتوجيه الأوامر للطابعات للعودة والسطر الجديد -جل ما وجدته-، لما برتوكول HTTP مثلًا يستخدمها! RFC2616[1]


على الجانب:

  1. LF أو Line Feed هو البايت الحادي عشر(العاشر إذا عددنا من الصفر) في ترميز الـASCII والمتوافق معه، ويكتب \n في أغلب التعابير القياسية/سلاسل النصوص أو \a(أو 0xA) في بعضها بالنظام الستُ عشري.

  2. CR أو Carriage Return هو البايت الرابع عشر(الثالث عشر إذا عددنا من الصفر) في ترميز الـASCII والمتوافق معه، ويكتب \r في أغلب .. أو \D(أو 0XD) في بعضها بالنظام ..

https://www.w3.org/Protocol...
يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

wgh أضف ردا

نظرياً،

CR هي /r وتعني العودة الى بداية السطر دون النزول للاسفل

و LF هي /n وتعني النزول سطر الى الاسفل دون العودة الى بداية السطر

لذا اذا كنا نريد النزول الى سطر جديد والتوجه الى بداية هذا السطر فنستخدم /r/n اي CRLF

لكن ما قلت هذا امر نظري واعتقد انه مقتبس من الطابعات الميكانيكية القديمة، ف CRLF صحيح اكثر من LF

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

يوسف سيد أضف ردا

شكرًا لك.

لكن ما قلت هذا امر نظري واعتقد انه مقتبس من الطابعات الميكانيكية القديمة، ف CRLF صحيح اكثر من LF

إذن هو فقط السبب، لا أراه سببًا منطقيًا لما نضع بايتين مع أنه يمكننا وضع واحد!!!

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

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

طبعا هذا يعتمد على البرنامج الذي سيفتح الملف ويستعرضه .. البرنامج هذا سيكون هو مسؤول عن الفحص للاوتوماتيكي لل end-of-line convention

اقتراح : استخدم LF اذا كنت تريد الارسال عبر الشبكة لانه بايت واحد .. للملفات استخدم CRLF لكي يدعم الويندوز .

شكرًا لك.

طبعا هذا يعتمد على البرنامج الذي سيفتح الملف ويستعرضه .. البرنامج هذا سيكون هو مسؤول عن الفحص للاوتوماتيكي لل end-of-line convention

الصيغة خاصة بالبرنامج؛ هو فقط من سيفتحها ويكتبها، وليست Raw Text أو يكتبها المستخدم، لذا كنت أبحث عن الأفضل بينهما لصيغة ثابتة لن تتغير في المستقبل.

اقتراح : استخدم LF اذا كنت تريد الارسال عبر الشبكة لانه بايت واحد .. للملفات استخدم CRLF لكي يدعم الويندوز .

يبدو أنّ هذا ما سأفعله سأستخدم LF فلا أجد سببًا يجعلني أستخدم CRLF بما أن الملف لن يفتح في نظام ويندوز(خاص بالبرنامج).

في لغة بيوربيزك يستخدمونهما للاثنين و لك ان تختار أيهما لان اللغة متعددة المنصات و حتى CRLF للويندوز اذا أردت التخصص لنظام معين، الزبدة من كلامي انه يمكنك اختيار ما شئت كلاهما يعملان لشئ واحد هذا ما استنتجته من تعلمي للغة الرائعة يمكنك مراجعتها.

يمكنك ان تنتج خوارزمية دالة السطر الجديد مستندا الى دالة اخرى EOL مثلا او التعابير القياسية Reg-Exp

يوسف سيد أضف ردا

@NibrasIO @khelll @wgh آسف جدًا على الإزعاج أيمكنكم مساعدتي هنا :)، لا أريد التسرع واختيار احداهما ثم أكتشف المشاكل بعد نشره، ولا أستطيع التغيير.

أعتقد أنه يجب عليك هنا أن تضحي بالحجم لحفظ Byte إضافي من أجل توافقية أكثر، لا أدري إن كان بالإمكان إيجاد حل وسط (دمج الحرفين ربما)، وتذكر أن معظم الناس اليوم يستخدون منتجات مايكروسوفت.

لن تحدث أي مشكلة مع ميكروسوفت؛ فهذه الصيغة لن تفتح في أي من برمجياتها، ستحفظ على ويندوز أي نعم؛ لكن لا مشاكل من هذا، دمج الحرفين أي صيغة جديدة اختراع جديد :)

[خارج الموضوع] هل إنشاء صيغة جديدة صعب أم سهل؟ وكيف بالبايثون؟

لا أرى أي صعوبة في الموضوع، تجد نظام لحفظ البيانات المستخدم كثيرًا XML واليوم نجدهم يستخدمون JSON أو تخترع واحدًا(قد يكون أفضل في بعض الحالات كأن توّفر ما لا تحتاجه) وبايثون سهل جدًا، أتريد مثالًا صديقي؟

أتريد مثالًا صديقي؟

نعم، إن أمكن.

آسف على التأخير أخي، هذا مثال بسيط جدًا هذه الشيفرة للكتابة، كتبتها لتعمل على Python 2 و3، لكن لم أجربها إلا على 2، write.py:

import xml.etree.cElementTree as ET
#from datetime.datetime import now
from datetime import datetime as dt
now = dt.now

__version_major = "1"
__version_minor = "0"
__version_patch = "0"
__author        = "samer"
__author_email  = "samer@......"
__date    = now().isoformat()

root    = ET.Element("myfle")

version = ET.SubElement(root, "version", major=__version_major, 
    minor=__version_minor, patch=__version_patch)

write_info = ET.SubElement(root, "info", author=__author,
    authorEmail=__author_email, date=__date)

doc      = ET.SubElement(root, "doc")
doc.text = "My file content!";

tree = ET.ElementTree(root)
tree.write("hello.myfile", xml_declaration = True,
   encoding="utf-8", method="xml")

وهذه للقراءة read.py:

from __future__ import print_function
import xml.etree.cElementTree as ET

_major_version = 1

tree     = ET.parse("hello.myfile")
fversion = tree.find("version")

if int(fversion.get("major")) > _major_version:
    raise Exception("unsuported file version {0} > {1}"
        .format(fversion.get("major"), _major_version))

print("version: ", "{0}.{1}.{2}"
    .format(fversion.get("major"), fversion.get("minor"),
        fversion.get("patch")))

finfo = tree.find("info")
print("author: ", finfo.get("author"))
print("author email: ", finfo.get("authorEmail"))
print("write date: ", finfo.get("date"))

fdoc = tree.find("doc")
print("document: ", fdoc.text)

مشاكل وأمور اعمل عليها:

  1. تأكد من الأخطاء وأن كل شيء بخير، وهل كل العناصر موجودة.

  2. نظام الحفظ للمفات غير ملائم وغير جيّد ابحث عن تنظيم أفضل.

  3. تأكد من الترميز، ودعم أكثر من ترميز مثلًا العربية window-1256.

  4. ينصح بضغط الملفات.

  5. أضف المزيد من الخصائص للصيغة.

  6. استخدم LF أو CRLF :)

  7. ابحث عن صيغة أفضل وابدأ بعمل حقيقي.

شكرًا لك. ولا داعٍ للاعتذار أخي. لو أمكن وضع الشفرات في موقع مثل هذا لكان أفضل:

يوسف سيد أضف ردا

كنت وضعتها على موقع مفضل لي أجرب عليه،

نفذ الملفات من الطرفية فيه.

نعم

يا ليت يوجد مثال

لو سمحت

كتبتُ مثالًا بسيطًا كتجربة صديقي، راجعه في الأعلى.

شكرا جزيلا لك

هل برنامجك هو المستخدم الوحيد لهذه الصيغة؟ إذا كان كذلك إختر أي منهم،

هل من المتوقع أن يجري المستخدم تعديلات؟ في هذه الحالة خزنها بنهاية السطر الخاصة بالنظام.

عند القراءة إدعم كلا النوعين.