سؤال

كيف \r و \n مختلف؟ أعتقد أنه يحتوي على شيء للقيام به مع UNIX مقابل Windows مقابل MAC، لكنني لست متأكدا تماما كيف يتمكنون من تختلف عنها، والبحث عن / تطابق في Regxes.

هل كانت مفيدة؟

المحلول

انهم شخصيات مختلفة. \r هو العودة العائد، و \n هو خط تغذية الخط.

على الطابعات "القديمة"، \r أرسل رأس الطباعة مرة أخرى إلى بداية الخط، و \n تقدم الورقة من قبل سطر واحد. لذلك كان من الضروري أن تبدأ الطباعة في السطر التالي.

من الواضح أن هذا غير ذي صلة بعض الشيء الآن، على الرغم من اعتماده على وحدة التحكم قد لا تزال قادرا على استخدام \r للانتقال إلى بداية الخط والكتابة فوق النص الموجود.

الأهم من ذلك، يونيكس يميل إلى استخدام \n كفاصل خط؛ ويندوز يميل إلى استخدام \r\n كفاصل خط و Macs (حتى نظام التشغيل 9) تستخدم ليستخدم \r كما فاصل الخط. (Mac OS X هو UNIX-Y، لذلك يستخدم \n في حين أن؛ قد يكون هناك بعض مواقف التوافق حيث \r يستخدم بدلا من ذلك.)

لمزيد من المعلومات، انظر ويكيبيديا نيو لاين المادة.

تحرير: هذه حساسة للغة. في C # و Java، على سبيل المثال، \n دائما يعني Unicode U + 000A، والتي يتم تعريفها على أنها تغذية الخط. في C و C ++، يكون الماء muddier إلى حد ما، حيث أن المعنى خاص بالمنصة. انظر التعليقات للحصول على التفاصيل.

نصائح أخرى

في C و C ++، \n هو مفهوم، \r هو شخصية، و \r\n هو (دائما تقريبا) خطأ قابلية قابلية.

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

عندما تريد إنهاء السطر الحالي والبدء في السطر التالي، كان عليك القيام بخطوتين منفصلين:

  1. نقل رأس الطباعة مرة أخرى إلى بداية السطر، ثم
  2. انقله إلى السطر التالي.

ترميز ASCII هذه الإجراءات كحرفين تحكم مميزين:

  • \x0D (CR) يتحرك رأس الطباعة مرة أخرى إلى بداية الخط. (يونيكود يرمز هذا كما U+000D CARRIAGE RETURN.)
  • \x0A (LF) ينقل رأس الطباعة إلى السطر التالي. (يونيكود يرمز هذا كما U+000A LINE FEED.)

في أيام Teletypes وطابعات التكنولوجيا المبكرة، استفاد الناس في الواقع من حقيقة أن هذه كانت عملية منفصلة. عن طريق إرسال CR دون اتباعها بواسطة LF، يمكنك طباعة على السطر الذي طباعته بالفعل. هذا التأثيرات المسموح بها مثل لهجات ونوع جريء وتسطير. يتم تطبيق بعض الأنظمة عدة مرات لمنع كلمات المرور من المرئية في Hardcopy. في محطات CRT المسلسل المبكرة، كانت CR واحدة من الطرق للتحكم في موضع المؤشر من أجل تحديث النص الموجود بالفعل على الشاشة.

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

  • تستخدم المتغيرات UNIX (بما في ذلك الإصدارات الحديثة من Mac) حرف LF للإشارة إلى جديد.
  • تستخدم ملفات Macintosh القديمة (Pre-OSX) مجرد حرف CR للإشارة إلى خط جديد.
  • VMS، CP / M، DOS، Windows، والعديد من بروتوكولات الشبكة لا يزال يتوقع كل من: CR LF.
  • أنظمة IBM القديمة التي تستخدم ebcdic. موحدة على NL - حرف غير موجود حتى في مجموعة أحرف ASCII. في يونيكود، NL U+0085 NEXT LINE, ، ولكن القيمة EBCDIC الفعلية هي 0x15.

لماذا اخترت أنظمة مختلفة أساليب مختلفة؟ ببساطة لأنه لم يكن هناك معيار عالمي. حيث تقول لوحة المفاتيح الخاصة بك "أدخل"، تستخدم لوحات المفاتيح القديمة أن تقول "العودة"، والتي كانت قصيرة لعودة النقل. في الواقع، في محطة تسلسلي، يؤدي الضغط على الإرجاع في الواقع حرف CR. إذا كنت تكتب محرر نصوص، فسيكون من المغري فقط استخدام هذه الشخصية كما جاءت من المحطة. ربما هذا هو السبب في أن أجهزة MACs القديمة تستخدم فقط كر.

الآن بعد أن لدينا المعايير, ، هناك أكثر طرق تمثيل استراحة السطر. على الرغم من نادر للغاية في البرية، فإن Unicode لديه أحرف جديدة مثل:

  • U+2028 LINE SEPARATOR
  • U+2029 PARAGRAPH SEPARATOR

حتى قبل جاء Unicode، أراد المبرمجين طرق بسيطة لتمثيل بعض رموز التحكم الأكثر فائدة دون القلق بشأن مجموعة الأحرف الأساسية. C لديه العديد من تسلسل الهروب لتمثيل رموز التحكم:

  • \a (لتنبيه) ما الذي يرن جرس Teletype أو يجعل صوت الصفير
  • \f (لتغذية النموذج) الذي يتحرك إلى بداية الصفحة التالية
  • \t (بالنسبة إلى علامة التبويب) التي تتحرك رأس الطباعة إلى وضع علامة التبويب الأفقي التالي

(هذه القائمة غير مكتملة عن قصد.)

يحدث هذا التعيين في وقت الترجمة- مترجم يرى \a ويضع أي قيمة سحرية تستخدم لرنين الجرس.

لاحظ أن معظم هؤلاء المنطوم لديهم ارتباطات مباشرة لرموز التحكم ASCII. علي سبيل المثال، \a سوف خريطة ل 0x07 BEL. وبعد يمكن كتابة مترجم لنظام يستخدم شيئا آخر غير ASCII لمجموعة الأحرف المضيفة (على سبيل المثال، EBCDIC). يمكن تعيين معظم رموز التحكم التي لديها فتات التخلص المحددة للتحكم في الرموز في مجموعات الأحرف الأخرى.

Huzzah! قابلية التنقل!

حسنا، تقريبا. في ج، أستطيع أن أكتب printf("\aHello, World!"); الذي يرن الجرس (أو الصفافير) ويخرج رسالة. ولكن إذا أردت بعد ذلك طباعة شيء ما في السطر التالي، فستظل بحاجة إلى معرفة ما تتطلب النظام الأساسي المضيف نقله إلى السطر التالي من الإخراج. CR LF؟ سجل تجاري؟ LF؟ NL؟ شيء آخر؟ الكثير من أجل قابلية النظام.

C لديه وضعين ل I / O: ثنائي ونص. في الوضع الثنائي، يتم إرسال البيانات التي يتم إرسال البيانات كما هو. ولكن في وضع النص، هناك مدة العرض ترجمة تحول شخصية خاصة إلى كل ما تحتاجه النظام الأساسي المضيف لخط جديد (والعكس صحيح).

عظيم، فما هي الشخصية الخاصة؟

حسنا، هذا هو التنفيذ المعتمد أيضا، ولكن هناك طريقة مستقلة لتنفيذ لتحديدها: \n. وبعد يسمى عادة "حرف نيولاين".

هذه نقطة خفية ولكن مهمة: \n يتم تعيين في وقت الترجمة إلى تحديد التنفيذ يتم بعد ذلك تعيين قيمة الأحرف التي (في وضع النص) مرة أخرى مدة العرض إلى الحرف الفعلي (أو تسلسل الأحرف) المطلوبة بواسطة النظام الأساسي الأساسي للانتقال إلى السطر التالي.

\n يختلف عن جميع الحرفات الخلفية الأخرى اللازمة لأن هناك تعيينين. هذا الخرائط من خطوتين يجعل \n مختلفة بكثير من حتى \r, ، والتي هي ببساطة تعيين وقت الترجمة إلى CR (أو رمز التحكم الأكثر مماثلة في كل ما هو مجموعة الأحرف الأساسية).

هذه الرحلات حتى العديد من المبرمجين C و C ++. إذا كنت في استطلاع 100 منهم، فإن 99 على الأقل ستخبرك بذلك \n يعني خط تغذية. هذا ليس صحيحا تماما. معظم (ربما كل) تطبيقات C و C ++ استخدم LF باعتبارها القيمة الوسيطة السحرية ل \n, ، ولكن هذا هو تفاصيل التنفيذ. من المجدي لمجموعة التحويل البرمجي لاستخدام قيمة مختلفة. في الواقع، إذا كانت مجموعة الأحرف المضيفة ليست مكبقة من ASCII (على سبيل المثال، إذا كان EBCDIC)، فعندئذ \n سيكون بالتأكيد بالتأكيد LF.

لذلك، في C و C ++:

  • \r هو حرفيا عودة النقل.
  • \n هي قيمة سحرية تترجم (في وضع النص) في مدة العرض من / إلى الدلالة الجديدة منصة النظام الجديد.
  • \r\n هو دائما تقريبا خطأ قابلية قابلية. في وضع النص، يتم ترجمة هذا إلى CR يتبعه تسلسل المنصة الجديدة - ربما لا ما هو المقصود. في الوضع الثنائي، يحصل ترجمة هذا إلى CR يتبعه بعض القيمة السحرية التي قد لا يكون LF - ربما ليس ما هو المقصود.
  • \x0A هي الطريقة الأكثر محمولة للإشارة إلى ASCII LF، ولكنك تريد فقط القيام بذلك في الوضع الثنائي. معظم تطبيقات وضع النص ستعامل مع ذلك \n.
  • " r" => العودة
  • " n" => NEWLINE أو LINDFEED (دلالات)

  • تستخدم الأنظمة المستندة إلى UNIX فقط " n" لإنهاء خط النص.

  • يستخدم DOS " r n" لإنهاء خط النص.
  • تستخدم بعض الآلات الأخرى فقط " r". (Commodore، Apple II، Mac OS قبل OS X، إلخ.)

في Short R لديه قيمة ASCII 13 (CR) و n لديه قيمة ASCII 10 (LF). يستخدم MAC CR محدد الخط (على الأقل، فعلت من قبل، لست متأكدا من أجهزة Mac الحديثة)، * يستخدم Nix LF ويستخدم Windows Windows (CRLF).

\r يستخدم للإشارة إلى بداية الخط ويمكن أن يحل محل النص من هناك، على سبيل المثال

main()
{
printf("\nab");
printf("\bsi");
printf("\rha");
}

ينتج هذا الناتج:

hai

\n هو لخط جديد.

بالإضافة إلى إجابة Jon Skeet:

استخدم Windows Traseally Windows r n، Unix n و Mac r، ومع ذلك، استخدم MACs Newer N كما هي UNIX القائمة.

في C # وجدت أنها تستخدم r n في سلسلة.

ص هو العودة العائد. n هو خط جديد (تغذية الخط) ... يعتمد على نظام التشغيل حول ما يعنيه كل منهما. اقرا هذا شرط لمزيد من الفرق بين " n" و " r n" ... في C.

ص تستخدم لعودة النقل. (قيمة ASCII 13) n تستخدم لخط جديد. (قيمة ASCII هي 10)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top