تسلسلات هروب أنسي

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

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

## التاريخ
أضاف تقريبًا جميع مصنِّعي الطرفيات المرئية تسلسلات هروب خاصة بالشركة المصنعة لتنفيذ عمليات مثل وضع المؤشر في مواضع عشوائية على الشاشة. من الأمثلة على ذلك طرفية VT52، التي سمحت بوضع المؤشر في موضع x,y على الشاشة عبر إرسال المحرف ، متبوعًا بمحرف ، ثم محرفين يمثلان القيم العددية x وy مضافًا إليهما 32 (وبالتالي تبدأ من محرف المسافة في أسكي وتتجنب محارف التحكم). وكانت هازلتين 1500 تحتوي على ميزة مشابهة، تُفعَّل باستخدام ، و ثم موضعي X وY مفصولين بفاصلة. وعلى الرغم من أن الطرفيتين كانتا تؤديان نفس الوظيفة، إلا أن تسلسلات التحكم المستخدمة فيهما كانت مختلفة.

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

حاول معيار أنسي معالجة هذه المشكلات من خلال وضع مجموعة أوامر تستخدمها جميع الطرفيات، مع اشتراط إرسال جميع البيانات الرقمية كأرقام ASCII. وكان أول معيار في هذه السلسلة هو *ECMA-48*، الذي اعتُمد عام 1976. وكان امتدادًا لسلسلة من معايير ترميز المحارف، أولها آيزو/آي إي سي 646 لعام 1965، وهو معيار من 7 بتات اشتُق منه آيزو/آي إي سي 646. أما اسم "تسلسل الهروب ANSI" فقد ظهر عام 1979 عندما اعتمد المعهد الأمريكي للمعايير الوطنية المعيار أنسي X3.64. وقد تعاونت لجنة أنسي X3L2 مع لجنة ECMA TC 1 لإنتاج معايير متطابقة تقريبًا. وتم دمج هذين المعيارين في معيار دولي هو ISO 6429. وفي عام 1994، سحبت أنسي معيارها لصالح المعيار الدولي.

تصغير|طرفية العرض المرئي DEC VT100.|alt=طرفية DEC VT100
أول طرفية عرض مرئي شائعة دعمت هذه التسلسلات كانت ديجيتال إكوبمينت VT100، التي قُدّمت عام 1978. وقد حقق هذا الطراز نجاحًا كبيرًا في السوق، مما أدى إلى ظهور عدد كبير من النسخ المقلَّدة لطرفية VT100، وكان من أوائلها وأشهرها الطرفية Zenith Z-89 الأرخص سعرًا في عام 1979. وظهرت طرفيات أخرى مثل Qume QVT-108، وTelevideo TVI-970، وWyse WY-99GT، بالإضافة إلى أوضاع اختيارية مثل "VT100" أو "VT103" أو "أنسي" بدرجات متفاوتة من التوافق في العديد من العلامات التجارية الأخرى. وقد أدت شعبية هذه الطرفيات تدريجيًا إلى افتراض معظم البرمجيات (وخاصة نظام لوحة البيانات والخدمات الإلكترونية الأخرى) أن تسلسلات الهروب مدعومة، مما أدى إلى دعمها في جميع الطرفيات الجديدة تقريبًا، وكذلك في برامج المحاكاة.

وفي عام 1981، اعتُمد معيار أنسي X3.64 للاستخدام في الحكومة الأمريكية عبر منشور المعايير الاتحادية لمعالجة المعلومات رقم 86. ولاحقًا، توقفت الحكومة الأمريكية عن تكرار معايير الصناعة، ولذلك تم سحب المنشور رقم 86.

وقد تم تحديث ECMA-48 عدة مرات، وهو حاليًا في الإصدار الخامس منذ عام 1991. وقد اعتمدته أيضًا المنظمة الدولية للمعايير واللجنة الكهرتقنية الدولية كمعيار *ISO/IEC 6429*. وقد تبنته المعايير الصناعية اليابانية كذلك تحت اسم JIS X 0211.

ومن المعايير ذات الصلة: الاتحاد الدولي للاتصالات، ومعيار Teletex، ومعيار *ISO/IEC 8613*، وهو معيار بنية الوثيقة المفتوحة (خاصة ISO/IEC 8613-6 أو ITU T.416). تشترك هذه الأنظمة في العديد من تسلسلات الهروب مع نظام ANSI، مع امتدادات قد لا تكون ذات معنى للطرفيات الحاسوبية. ومع أن النظامين سرعان ما خرجا من الاستخدام، إلا أن معيار ECMA-48 ما زال يحتفظ بهذه الامتدادات كـ "محجوزة".

## الدعم على المنصات

تصغير|محاكي الطرفية Xterm.|alt=محاكي الطرفية Xtermفي أوائل ثمانينيات القرن العشرين، استخدم عدد كبير من البرمجيات هذه التسلسلات مباشرة لتحديث شاشات العرض. وشمل ذلك كل شيء تقريبًا على نظام ذاكرة افتراضية مفتوح (والذي افترض وجود طرفيات DEC)، ومعظم البرمجيات المصممة لتكون قابلة للنقل على حواسيب سي بي / م المنزلية، بل وحتى الكثير من برامج يونكس نظرًا لأن استخدامها كان أسهل من مكتبات تيرمكامب، مثل الأمثلة على البرمجة النصية في الصدفة التي تظهر لاحقًا في هذه المقالة.

غالبًا ما تدعم محاكيات الطرفيات التي تتواصل مع أجهزة بعيدة تسلسلات أنسي الهروب. يشمل ذلك أي برنامج كُتب للتواصل مع أنظمة لوحة الإعلانات على الحواسيب المنزلية والشخصية. كما أن محاكيات الطرفيات على أنظمة يونكس مثل *xterm* يمكنها التواصل مع البرمجيات التي تعمل على نفس الجهاز، وبالتالي يمكن للبرمجيات العاملة ضمن بيئة X11 عبر محاكي طرفية أن تفترض إمكانية استخدام هذه التسلسلات.

ومع تطور قدرات الحواسيب، بدأت الشاشات المدمجة تدعم هذه التسلسلات أيضًا، مما سمح للبرمجيات بأن تكون قابلة للنقل بين أنظمة CP/M. كما وُجدت محاولات لتوسيع تسلسلات الهروب لتشمل دعم الطابعات واستخدامها كصيغة مبكرة لتخزين المستندات مشابهة لـ PDF، أي هندسة المستندات المفتوحة .

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

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

لم تكن وحدة تحكم ويندوز تدعم تسلسلات هروب أنسي، كما أن مايكروسوفت لم توفّر وسيلة لتفعيلها. وقد ظهرت بدائل مثل تي سي سي من JP Software (وكان يُعرف سابقًا بـ 4NT)، وبرنامج أنسي.كوم من مايكل جي. ميفورد، و من جيسون هود، بالإضافة إلى كونسول إمولاتور من Maximus5، والتي مكّنت دعم تسلسلات أنسي. كما استخدمت برمجيات مثل مكتبة colorama في Python وسيج وين تقنيات لمعالجة النصوص أثناء تنفيذها، حيث كانت تحلل تسلسلات أنسي وتقوم بمحاكاتها عبر استدعاءات نظام ويندوز.

وفي عام 2016، أصدرت مايكروسوفت تحديثًا لنظام ويندوز 10 ضمن تاريخ إصدارات ويندوز 10، وقد تضمّن هذا التحديث بشكل غير متوقع دعمًا لتسلسلات هروب ANSI، وذلك بعد أكثر من ثلاثين عامًا على إطلاق نظام ويندوز. وقد تم تنفيذ هذا التحديث جنبًا إلى جنب مع نظام ويندوز الفرعي للينكس، ويبدو أن الهدف منه كان السماح للبرمجيات الطرفية المبنية على شبيه يونكس باستخدام وحدة تحكم ويندوز. وقد فعّل PowerShell 5.1 هذا الدعم افتراضيًا، بينما مكّن PowerShell 6 تضمين رمز ESC اللازم ضمن سلسلة نصية باستخدام .

يدعم طرفية ويندوز، الذي تم تقديمه في 2019، هذه التسلسلات افتراضيًا، وتنوي مايكروسوفت استبدال وحدة تحكم ويندوز بمحطة طرفية لنظام التشغيل ويندوز.

## رموز التحكم C0

يفترض معظم المستخدمين بعض الوظائف المرتبطة ببعض المحارف أحادية البايت. وقد تم تعريف مجموعة رموز التحكم C0 مبدئيًا كجزء من معيار أسكي، وهي تُعرف الآن افتراضيًا ضمن معيار آيزو 6429 (المعروف أيضًا باسم ECMA-48)، مما يجعلها جزءًا من نفس المعيار الذي يضم مجموعة C1 المستخدمة ضمن تسلسلات هروب أنسي (على الرغم من أن آيزو 2022 يسمح باستخدام مجموعة C0 من آيزو 6429 دون مجموعة C1 منه، والعكس صحيح، بشرط أن يكون 0x1B دائمًا هو رمز الهروب ESC). وتُستخدم هذه الرموز لتقليل كمية البيانات المنقولة، أو لتنفيذ بعض الوظائف التي لا يمكن تنفيذها باستخدام تسلسلات الهروب:

تختلف تسلسلات الهروب في الطول. ويُحدَّد الشكل العام لتسلسل هروب متوافق مع أنسي من قِبل المعهد الأمريكي للمعايير الوطنية (وهو ما يعادل ECMA-35 أو ISO/IEC 2022). تتكون تسلسلات الهروب فقط من بايتات ضمن النطاق  (جميع محارف أسكي غير الخاصة بالتحكم)، ويمكن تحليلها دون الحاجة إلى النظر للأمام. أما السلوك الناتج عند مواجهة محرف تحكم، أو بايت ذي البت الأعلى مُفعّل، أو بايت لا يشكل جزءًا من أي تسلسل صحيح قبل الوصول إلى النهاية، فهو غير معرف.

## تسلسلات الهروب من النوع Fe

إذا تبِعَت  بايت يقع في النطاق من 0x40 إلى 0x5F، فإن تسلسل الهروب يُعد من النوع . وتُحال عملية تفسيره إلى معيار رموز التحكم من نوع C1 المعمول به. وبناءً على ذلك، تتبع جميع تسلسلات الهروب التي تتوافق مع رموز التحكم C1 من أنسي X3.64 / ECMA-48 هذا الشكل.

يشير المعيار إلى أنه في البيئات التي تستخدم 8 بت، يمكن تمثيل دوال التحكم المقابلة لتسلسلات الهروب من النوع  (تلك التابعة لمجموعة رموز التحكم C1) كبايتات منفردة تقع في النطاق 0x80–0x9F. وهذا ممكن في ترميزات المحارف المتوافقة مع مواصفات الترميز ثُماني البت التي يحددها معيار ISO 2022، مثل سلسلة آيزو/آي إي سي 8859. ومع ذلك، فإن ترميزات المحارف المستخدمة في الأجهزة الحديثة مثل صيغة التحويل الموحد-8 (UTF-8) أو ويندوز-1252 كثيرًا ما تُخصّص هذه الرموز لاستخدامات أخرى، لذا يُستخدم غالبًا تسلسل مكوّن من بايتين فقط. في حالة UTF-8، يؤدي تمثيل رمز تحكم من نوع C1 عبر كتلة عناصر التحكم C1 واللاتينية التكميلية-1 إلى توليد رمز ثنائي البايت مختلف (مثال:  للمحرف )، ولكن لا يتم توفير مساحة بهذه الطريقة.

## أوامر مُعرّف تسلسل التحكم (CSI)

بالنسبة لأوامر مُعرّف تسلسل التحكم، أو CSI، فإن الرمز  (ويُكتب في بعض لغات البرمجة كـ  أو  أو ) يتبعه أي عدد (بما في ذلك الصفر) من «بايتات المعامل» ضمن النطاق 0x30–0x3F (أي الحروف `0–9:;&lt;=&gt;?` في ASCII)، ثم أي عدد من «بايتات التوسيط» في النطاق 0x20–0x2F (أي المسافة وعلامات الترقيم )، وأخيرًا بايت واحد «نهائي» في النطاق 0x40–0x7E (أي الحروف `@A–Z[\]^_`a–z{|}~` في ASCII).

جميع التسلسلات الشائعة تستخدم المعاملات كسلسلة من الأرقام مفصولة بفواصل منقوطة مثل . تُعامل الأرقام المفقودة على أنها  (على سبيل المثال،  يُعامل الرقم الأوسط على أنه ، وعدم وجود معاملات على الإطلاق في  يُعادل الكود  لإعادة الضبط). بعض التسلسلات (مثل CUU) تُعامل  على أنه  لجعل المعاملات المفقودة مفيدة.

تم اعتبار مجموعة فرعية من الترتيبات "خاصة" حتى يتمكن مصنعو الطرفيات من إدراج تسلسلاتهم الخاصة دون التعارض مع المعيار. التسلسلات التي تحتوي على بايتات المعامل `&lt;=&gt;?` أو البايتات النهائية من 0x70 إلى 0x7E (أي `p–z{|}~`) تُعد خاصة.

سلوك الطرفية غير محدد إذا احتوى تسلسل CSI على أي حرف خارج النطاق 0x20–0x7E. تُعد هذه الأحرف غير قانونية وتشمل أحرف التحكم C0 (النطاق 0–0x1F)، وحرف DEL (0x7F)، أو بايتات ذات البت الأعلى مفعّل. الاستجابات المحتملة تشمل تجاهل البايت، أو معالجته فورًا، وأيضًا ما إذا كان ينبغي متابعة تسلسل CSI، أو إيقافه فورًا، أو تجاهل بقية التسلسل.

## محددات اختيار العرض الرسومي
تُستخدم سلسلة التحكم `CSI  m`، المعروفة باسم "اختيار العرض الرسومي" (SGR)، لتعيين سمات العرض. يمكن تعيين عدة سمات في نفس السلسلة، مفصولة بفواصل منقوطة. تظل كل سمة عرض مفعّلة حتى تحدث سلسلة SGR لاحقة تقوم بإعادة ضبطها. إذا لم تُعطَ رموز، تُعامل  كما لو كانت  (إعادة ضبط / الوضع الطبيعي).

### الألوان

#### ألوان 3-بت و4-بت

المواصفة الأصلية احتوت فقط على 8 ألوان، وتم تحديدها بالأسماء فقط. كانت المعلمات SGR من 30 إلى 37 تُستخدم لاختيار لون المقدمة، في حين أن القيم من 40 إلى 47 كانت تُستخدم لاختيار لون الخلفية. عدد كبير من الطرفيات قامت بتنفيذ خاصية "عريض" (رمز SGR هو 1) على أنها لون أكثر سطوعًا بدلاً من خط مختلف، مما أتاح 8 ألوان إضافية للمقدمة. غالبًا لم يكن بالإمكان استخدام هذه الألوان الأكثر سطوعًا للخلفية، رغم أن بعض الأحيان كان تفعيل "عكس الفيديو" (رمز SGR هو 7) يتيح ذلك. على سبيل المثال: للحصول على حروف سوداء على خلفية بيضاء استخدم ، وللحصول على اللون الأحمر استخدم ، وللحصول على اللون الأحمر الساطع استخدم . لإعادة ضبط الألوان إلى الإعدادات الافتراضية، استخدم  (غير مدعوم في بعض الطرفيات)، أو أعد ضبط جميع السمات باستخدام . لاحقًا، أضافت بعض الطرفيات القدرة على تحديد الألوان "الساطعة" مباشرة باستخدام القيم من 90 إلى 97 للمقدمة، و100 إلى 107 للخلفية.

يوضح الجدول أدناه بعض الأمثلة حول كيفية تحويل رموز الألوان ذات 4-بت إلى رموز ألوان ذات 24-بت وفقًا لمعيار VGA وبعض محاكيات الطرفية الحديثة.




FG (المقدمة)
BG (الخلفية)
الاسم
VGA
وحدة تحكم ويندوز إكس بي
باورشل
فيجوال ستوديو كود
وحدة تحكم ويندوز 10
Terminal.app (ماك)
بوتي
mIRC
xterm
أوبونتو
طرفية Eclipse


`30`
`40`
أسود
0، 0، 0
12، 12، 12
0، 0، 0
1، 1، 1
0، 0، 0


`31`
`41`
أحمر
170، 0، 0
128، 0، 0
205، 49، 49
197، 15، 31
153، 0، 0
187، 0، 0
127، 0، 0
205، 0، 0
222، 56، 43
205، 0، 0


`32`
`42`
أخضر
0، 170، 0
0، 128، 0
13، 188، 121
19، 161، 14
0، 166، 0
0، 187، 0
0، 147، 0
0، 205، 0
57، 181، 74
0، 205، 0


`33`
`43`
أصفر
170، 85، 0يُعرض كبرتقالي في شاشات CGA
128، 128، 0
238، 237، 240
229، 229، 16
193، 156، 0
153، 153، 0
187، 187، 0
252، 127، 0
205، 205، 0
255، 199، 6
205، 205، 0


`34`
`44`
أزرق
0، 0، 170
0، 55، 218
36، 114، 200
0، 55، 218
0، 0، 128
0، 0، 187
0، 0، 127
0، 0، 238
60، 94، 169
0، 0، 238


`35`
`45`
أرجواني
170، 0، 170
128، 0، 128
188، 63، 188
136، 23، 152
166، 0، 166
187، 0، 187
127، 0، 127
205، 0، 205
208، 99، 195
205، 0، 205


`36`
`46`
سماوي
0، 170، 170
0، 128، 128
17، 168، 205
58، 150، 221
0، 166، 166
0، 187، 187
0، 147، 147
0، 205، 205
68، 185، 177
0، 205، 205


`37`
`47`
أبيض
170، 170، 170
192، 192، 192
255، 255، 255
229، 229، 229
204، 204، 204
204، 204، 204
187، 187، 187
178، 178، 178
229، 229، 229
238، 238، 236
229، 229، 229




#### 8-بت

مع شيوع جداول البحث في لون 8-بت على بطاقات الرسومات، أُضيفت تسلسلات الهروب لتمكين اختيار الألوان من مجموعة محددة مسبقًا تتكون من 256 لونًا:


```
ESC[38;5;m لاختيار لون المقدمة، حيث n رقم من الجدول أدناه
 ESC[48;5;m لاختيار لون الخلفية
   0–7:    الألوان القياسية (كما في ESC[30–37m)
   8–15:   ألوان عالية السطوع (كما في ESC[90–97m)
  16–231: مكعب ألوان 6×6×6 (216 لونًا): 16 + 36 × r + 6 × g + b (حيث 0 ≤ r وg وb ≤ 5)
 232–255: تدرج رمادي من الداكن إلى الفاتح على 24 مستوى
```


تختلف الألوان المعروضة لهذه القيم بين تطبيقات الطرفيات والمحاكيات، إذ إن المواصفات المعترف بها مثل ECMA-48 ومواصفة T.416 الصادرة عن الاتحاد الدولي للاتصالات لا تُعرّف لوحة ألوان ثابتة لهذا الجدول المرجعي. ورغم أن استخدام الصيغة المذكورة أعلاه شائع في توليد لوحة الألوان، فإن الخوارزمية وخيارات الألوان لقيم مكعب الألوان من 16 إلى 231 تختلف حسب التطبيق. تُعرض أدناه لوحة الألوان والخوارزمية المستخدمة في XTerm كمثال.

تستخدم مواصفة الاتحاد الدولي للاتصالات T.416 بعنوان *تقنية المعلومات – بنية الوثيقة المفتوحة (ODA) وتنسيق التبادل: بُنى محتوى الأحرف*  الرمز ":" كفاصل بدلاً من ذلك.


```
ESC[38:5:m لاختيار لون المقدمة، حيث n رقم من الجدول أدناه
 ESC[48:5:m لاختيار لون الخلفية
```



لِحساب قيمة *RGB* لرمزٍ ما في مكعب الألوان 6 × 6 × 6، يمكن استخدام الشيفرة التالية:

```python
# print a list of the 256-color red/green/blue values used by xterm.
#
# reference:
# https://github.com/ThomasDickey/ncurses-snapshots/blob/master/test/xterm-16color.dat
# https://github.com/ThomasDickey/xterm-snapshots/blob/master/XTerm-col.ad
# https://github.com/ThomasDickey/xterm-snapshots/blob/master/256colres.pl

print("colors 0-16 correspond to the أنسي and aixterm naming")
for code in range(0, 16):
    if code > 8:
        level = 255
    elif code == 7:
        level = 229
    else:
        level = 205
    r = 127 if code == 8 else level if (code & 1) != 0 else 92 if code == 12 else 0
    g = 127 if code == 8 else level if (code & 2) != 0 else 92 if code == 12 else 0
    b = 127 if code == 8 else 238 if code == 4 else level if (code & 4) != 0 else 0
    print(f"{code:3d}: {r:02X} {g:02X} {b:02X}")

print("colors 16-231 are a 6x6x6 color cube")
for red in range(0, 6):
    for green in range(0, 6):
        for blue in range(0, 6):
            code = 16 + (red * 36) + (green * 6) + blue
            r = red   * 40 + 55 if red   != 0 else 0
            g = green * 40 + 55 if green != 0 else 0
            b = blue  * 40 + 55 if blue  != 0 else 0
            print(f"{code:3d}: {r:02X} {g:02X} {b:02X}")

print("colors 232-255 are a grayscale ramp, intentionally leaving out black and white")
code = 232
for gray in range(0, 24):
    level = gray * 10 + 8
    code = 232 + gray
    print(f"{code:3d}: {level:02X} {level:02X} {level:02X}")
```


هناك أيضًا ترميز مشابه لكن غير متوافق يتكون من 88 لونًا، يستخدم نفس تسلسل الهروب، وقد ظهر في  و. ويعتمد على مكعب ألوان بأبعاد 4×4×4.

#### 24-بت

مع انتشار بطاقات الرسومات التي تدعم "الألوان الحقيقية" بـ16 إلى 24 بت، بدأت التطبيقات تدعم ألوان 24-بت. من بين محاكيات الطرفية التي تدعم تعيين ألوان الواجهة والخلفية بدقة 24-بت باستخدام تسلسلات الهروب: Xterm، وكونسول الخاص ببيئة كدي، وiTerm، وكذلك جميع الطرفيات المبنية على مكتبة libvte، بما في ذلك طرفية جنوم.



```
ESC[38;2;⟨r⟩;⟨g⟩;⟨b⟩m Select RGB foreground color
ESC[48;2;⟨r⟩;⟨g⟩;⟨b⟩m Select RGB background color
```



يُعتقد أن هذه الصيغة مستندة إلى معيار الاتحاد الدولي للاتصالات T.416 حول هندسة المستندات المفتوحة (ODA) وتنسيق التبادل: معمارية محتوى الأحرف، والذي تم اعتماده لاحقًا تحت اسم ISO/IEC 8613-6، لكنه فشل تجاريًا. وتكون نسخة ODA أكثر تعقيدًا وبالتالي غير متوافقة:

* المعلمات بعد الرقم '2' (r وg وb) اختيارية ويمكن تركها فارغة.
* يتم استبدال الفواصل المنقوطة بنقطتين، كما هو موضح أعلاه.
* يوجد "معرّف مساحة اللون" في البداية. تعريف هذا المعرّف غير مضمَّن في ذلك المعيار، لذا يمكن تركه فارغًا لتمثيل القيمة الافتراضية غير المحددة. بالنسبة لمواصفات اللون بنظام CMYK، يفسّر برنامج mintty هذا المعامل على أنه يحدد القيمة القصوى التي تُقاس منها قنوات الألوان (مثل 100 أو 255).
* بالإضافة إلى القيمة '2' بعد 48 التي تحدد تنسيق الأحمر-الأخضر-الأزرق (RGB) (و'5' أعلاه لترميز اللون المؤشر 0–255)، توجد بدائل أخرى: '0' لتمثيل "مُعرّف حسب التطبيق"، و'1' للشفافية – وكلاهما لا يحتوي على معلمات إضافية؛ و'3' لتحديد الألوان باستخدام نظام السماوي-الأرجواني-الأصفر (CMY)، و'4' لنظام السماوي-الأرجواني-الأصفر-الأسود (CMYK)، حيث يُستخدم الموضع المسمى "غير مستخدم" لتمثيل مكوّن اللون الأسود.



```
ESC[38:2:⟨Color-Space-ID⟩:⟨r⟩:⟨g⟩:⟨b⟩:⟨unused⟩:⟨CS tolerance⟩:⟨Color-Space⟩m Select RGB foreground color
ESC[48:2:⟨Color-Space-ID⟩:⟨r⟩:⟨g⟩:⟨b⟩:⟨unused⟩:⟨CS tolerance⟩:⟨Color-Space⟩m Select RGB background color
```



حيث تشير  إلى نوع مساحة اللون المرتبطة بالتحمّل المُعطى:  لـCIELUV أو  لـCIELAB.

يتم دعم إصدار ITU-RGB من قِبل xterm، حيث يتم تجاهل معرّف مساحة اللون ومعامل التحمّل. أما الصيغة الأبسط باستخدام الفواصل المنقوطة، فقد ظهرت لأول مرة في Konsole.

#### متغيرات البيئة في يونكس المتعلقة بدعم الألوان

بدلاً من استخدام دعم الألوان في termcap وterminfo الذي تم تقديمه في إصدار SVr3.2 (عام 1987)، استخدمت مكتبة S-Lang (الإصدار 0.99-32، يونيو 1996) متغير بيئة منفصلًا هو  للإشارة إلى ما إذا كان محاكي الطرفية يمكنه استخدام الألوان على الإطلاق، وأضافت لاحقًا قيماً تشير إلى ما إذا كان يدعم الألوان ذات 24-بت. هذا النظام، رغم توثيقه الضعيف، أصبح شائعًا بدرجة كافية دفعت توزيعات مثل Fedora وRHEL إلى التفكير في استخدامه كآلية أبسط وأكثر شمولًا للكشف مقارنة باستعلام المكتبات المحدّثة.

تقوم بعض محاكيات الطرفية (مثل urxvt وkonsole) بتعيين المتغير  للإبلاغ عن نظام ألوان الطرفية (وخاصة الخلفية الفاتحة مقابل الداكنة). نشأ هذا السلوك في مكتبة S-Lang ويُستخدم في برنامج vim. أما gnome-terminal، فيرفض إضافة هذا السلوك، لأن صيغة القيمة غير متفق عليها، ولا يمكن تغيير القيمة عند تغيير لوحة الألوان أثناء التشغيل، كما أن تسلسلات xterm OSC 4/10/11 "الأكثر ملاءمة" موجودة بالفعل.

## تسلسلات أوامر نظام التشغيل<span class="anchor" id="OSC"></span>

تم تعريف معظم تسلسلات أوامر نظام التشغيل (OSC) بواسطة الطرفية Xterm، لكن العديد منها مدعوم أيضًا من قِبل محاكيات طرفية أخرى. ولأسباب تاريخية، يمكن للطرفية Xterm أن تُنهي الأمر إما برمز  (0x07) أو بالتسلسل القياسي  (0x9C أو 0x1B 0x5C). على سبيل المثال، تتيح Xterm تعيين عنوان النافذة باستخدام الأمر .

من الإضافات غير التابعة لـ Xterm ميزة الارتباط التشعبي، والتي تُستخدم بتسلسل  منذ عام 2017، وتُستخدم من قِبل مكتبة VTE، وiTerm2، وmintty، من بين محاكيات أخرى.

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

## تسلسلات الهروب من نوع Fs

إذا تبع  بايت ضمن النطاق ، فإن تسلسل الهروب يكون من نوع . يُستخدم هذا النوع للوظائف التحكمية المسجلة بشكل فردي في سجل ISO-IR. يتم عرض جدول لهذه الوظائف تحت قسم ISO/IEC 2022.

## تسلسلات الهروب من نوع Fp

إذا تبع  بايت ضمن النطاق ، فإن تسلسل الهروب يكون من نوع ، وهو مخصص لما يصل إلى ستة عشر وظيفة تحكم للاستخدام الخاص.

## تسلسلات الهروب من نوع nF

إذا تبع  بايت ضمن النطاق ، فإن تسلسل الهروب يكون من نوع . يتبع هذا البايت أي عدد من البايتات الإضافية في هذا النطاق، ثم بايت ضمن النطاق . تُصنف هذه التسلسلات بشكل فرعي حسب أقل بتين في البايت الأول، على سبيل المثال "النوع " للتسلسلات التي يبدأ فيها البايت الأول بـ ؛ وحسب ما إذا كان البايت النهائي ضمن النطاق ، مما يشير إلى الاستخدام الخاص (على سبيل المثال "النوع ") أو لا (على سبيل المثال "النوع ").

تُستخدم معظم تسلسلات  لتغيير مجموعة الأحرف الحالية، وهي مدرجة في ISO/IEC 2022. وبعض التسلسلات الأخرى:

إذا كان البايت الأول هو '#'، فإن التسلسلات العامة محجوزة لوظائف التحكم الفردية المسجلة في ISO-IR. لا توجد تسلسلات مسجلة حالياً. تتوفر تسلسلات من النوع  (التي تشمل تلك التي تبدأ بـ '#') لوظائف التحكم للاستخدام الخاص.

## أمثلة

 — هذا يقوم بمسح الشاشة، وعلى بعض الأجهزة، يقوم بتحديد موقع المؤشر في الموضع y,x 1,1 (الزاوية العلوية اليسرى).

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

 — هذا يعيد تعيين المفتاح F10 لإرسال السلسلة "DIR" وENTER إلى المخزن المؤقت للوحة المفاتيح، مما يعرض محتويات الدليل الحالي في سطر أوامر DOS. (خاص بـ MS-DOS ANSI.SYS فقط) كان يُستخدم أحيانًا للـ المعهد الأمريكي للمعايير الوطنية. هذا هو رمز استخدام خاص (كما يشار إليه بالحرف p)، باستخدام تمديد غير قياسي لإضافة معلمة من نوع سلسلة. وفقًا للحرف الموجود في المعيار، ينتهي التسلسل عند الحرف D.

 — هذا يحفظ موضع المؤشر. باستخدام التسلسل  سيتم استعادته إلى نفس الموضع. على سبيل المثال، إذا كان الموضع الحالي للمؤشر هو 7(y) و 10(x)، فإن التسلسل  سيحفظ هذين الرقمين. الآن يمكنك الانتقال إلى موضع مؤشر آخر، مثل 20(y) و 3(x)، باستخدام التسلسل  أو . الآن إذا استخدمت التسلسل ، سيعود موضع المؤشر إلى 7(y) و 10(x). بعض المحطات تتطلب تسلسلات DEC  /  بدلاً منها، والتي تُعتبر مدعومة بشكل أوسع.

### في البرمجة النصية

يتم استخدام رموز الهروب أنسي بشكل شائع في يونكس والأنظمة المشابهة لوحدة التحكم UNIX لتوفير إبراز النحو. على سبيل المثال، على المحطات المتوافقة، يقوم أمر *[[إل إس]]* التالي بتلوين أسماء الملفات والدلائل حسب النوع.

 ls --color

يمكن للمستخدمين استخدام رموز الهروب في سكريبتاتهم من خلال تضمينها كجزء من *[[تيارات البيانات الموحدة]]* أو *[[تيارات البيانات الموحدة]]*. على سبيل المثال، يقوم أمر *[[محرر التيار (أداة يونكس)|محرر التيار]]* GNU التالي بتجميل مخرجات أمر *[[صنع (برمجة)|صنع]]* عن طريق عرض الأسطر التي تحتوي على كلمات تبدأ بـ "WARN" في الفيديو العكسي والكلمات التي تبدأ بـ "ERR" باللون الأصفر الساطع على خلفية حمراء داكنة (نسق الحرف مُتجاهل). تم تمييز تمثيلات الرموز.

 make 2&gt;&amp;1 | sed -e 's/.*\bWARN.*/\x1b[7m&\x1b[0m/i' -e 's/.*\bERR.*/\x1b[93;41m&\x1b[0m/i'

الوظيفة التالية في باش تقوم بوميض المحطة (عن طريق إرسال رموز وضع الفيديو العكسي والطبيعي بالتناوب) حتى يضغط المستخدم على مفتاح.

 flasher () { while true; do printf \\e[?5h; sleep 0.1; printf \\e[?5l; read -s -n1 -t1 && break; done; }

يمكن استخدام هذا لتنبيه المبرمج عندما تنتهي أمر طويل، مثل .

 printf \\033c

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

### في C
البرنامج التالي ينشئ جدولًا للأرقام من 0 إلى 109، كل منها يتم عرضه بالتنسيق المحدد بواسطة تسلسل الهروب سي جي آر باستخدام ذلك الرقم كرمز لتنسيق الرسوم البيانية.
يسار|تصغير|مخرجات البرنامج المثال على طرفية جنوم

```c
#include <stdio.h>

int main(void)
{
    int i, j, n;

    for (i = 0; i < 11; i++) {
        for (j = 0; j < 10; j++) {
            n = 10 * i + j;
            if (n > 108) break;
            printf("\033[%dm %3d\033[m", n, n);
        }
        printf("\n");
    }
    return 0;
}
```


## تسلسلات إدخال الطرفية
الضغط على المفاتيح الخاصة على لوحة المفاتيح، بالإضافة إلى إخراج العديد من تسلسلات xterm CSI و DCS أو OSC، غالبًا ما ينتج تسلسل CSI أو DCS أو OSC، يُرسل من الطرفية إلى الكمبيوتر كما لو أن المستخدم قد كتبه.

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

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


```
<char>                                         -> char

<esc> <nochar>                                 -> esc

<esc> <esc>                                    -> esc

<esc> <char>                                   -> Alt-keypress or keycode sequence

<esc> '[' <nochar>                             -> Alt-[
<esc> '[' (<modifier>) <char>                  -> keycode sequence, <modifier> is a decimal                                             number and defaults to 1 (xterm)

<esc> '[' (<keycode>) (';'<modifier>) '~'      -> keycode sequence, <keycode> and <modifier>
                                                  are decimal numbers and default to 1 (vt)
```



إذا كان الحرف النهائي هو '~'، يجب أن يكون الرقم الأول موجودًا وهو رقم رمز المفتاح، بينما الرقم الثاني هو قيمة معدّل اختيارية. أما إذا كان الحرف النهائي هو حرف، فيكون الحرف هو قيمة رمز المفتاح، والرقم الاختياري هو قيمة المعدّل.

قيمة المعدّل تكون افتراضيًا 1، وبعد خصم 1 تصبح بت خريطة المفاتيح المعدّلة التي تم الضغط عليها: . على سبيل المثال، `&lt;esc>[4;2~` هو ، `&lt;esc>[20~` هو مفتاح الوظيفة ، `&lt;esc>[5C` هو .

بعبارة أخرى، المعدّل هو مجموع الأرقام التالية:



```
vt sequences:
<esc>[1~    - Home        <esc>[16~   -             <esc>[31~   - F17
<esc>[2~    - Insert      <esc>[17~   - F6          <esc>[32~   - F18
<esc>[3~    - Delete      <esc>[18~   - F7          <esc>[33~   - F19
<esc>[4~    - End         <esc>[19~   - F8          <esc>[34~   - F20
<esc>[5~    - PgUp        <esc>[20~   - F9          <esc>[35~   - 
<esc>[6~    - PgDn        <esc>[21~   - F10         
<esc>[7~    - Home        <esc>[22~   -             
<esc>[8~    - End         <esc>[23~   - F11         
<esc>[9~    -             <esc>[24~   - F12         
<esc>[10~   - F0          <esc>[25~   - F13         
<esc>[11~   - F1          <esc>[26~   - F14         
<esc>[12~   - F2          <esc>[27~   -             
<esc>[13~   - F3          <esc>[28~   - F15         
<esc>[14~   - F4          <esc>[29~   - F16         
<esc>[15~   - F5          <esc>[30~   -

xterm sequences:
<esc>[A     - Up          <esc>[K     -             <esc>[U     -
<esc>[B     - Down        <esc>[L     -             <esc>[V     -
<esc>[C     - Right       <esc>[M     -             <esc>[W     -
<esc>[D     - Left        <esc>[N     -             <esc>[X     -
<esc>[E     -             <esc>[O     -             <esc>[Y     -
<esc>[F     - End         <esc>[1P    - F1          <esc>[Z     -
<esc>[G     - Keypad 5    <esc>[1Q    - F2       
<esc>[H     - Home        <esc>[1R    - F3       
<esc>[I     -             <esc>[1S    - F4       
<esc>[J     -             <esc>[T     -
```



`&lt;esc>[A` إلى `&lt;esc>[D` هي نفسها تسلسلات الإخراج أنسي. يتم عادةً حذف `&lt;modifier>` إذا لم يتم الضغط على مفاتيح معدلة، ولكن معظم التطبيقات تقوم دائمًا بإصدار `&lt;modifier>` عند الضغط على . (قسم مسودة)

تحتوي Xterm على صفحة توثيق شاملة حول مخططات تسلسل إدخال المفاتيح الوظيفية والفأرة المختلفة من محطات VT الخاصة بشركة DEC وتمت إضافة الكثير من الدعم لها عبر الزمن بواسطة توماس ديكي؛ كما أنه يحافظ على قائمة بالمفاتيح الافتراضية المستخدمة من قبل محاكيات الطرفيات الأخرى للمقارنة.

* على وحدة تحكم لينوكس، بعض مفاتيح الوظائف تولد تسلسل من الشكل `CSI [ ''char''`. يجب أن ينتهي تسلسل CSI على `[`.
* إصدارات قديمة من "Terminator" تولد `SS3 1; ''modifiers'' ''char''` عندما يتم الضغط على  مع المفاتيح المعدلة. تم نسخ هذا السلوك من طرفية جنوم.
* xterm يرد بـ `CSI ''row'' ; ''column'' R` إذا طُلب موقع المؤشر و`CSI 1 ; ''modifiers'' R` إذا تم الضغط على مفتاح  مع المفاتيح المعدلة، مما يؤدي إلى تصادم في حالة `''row'' == 1`. يمكن تجنب ذلك باستخدام المعدل الخاص *?* كـ `CSI ? 6 n`، والذي سينعكس في الاستجابة كـ `CSI ? ''row'' ; ''column'' R`.
* العديد من المحاكيات تضيف `ESC` إلى أي حرف يتم كتابته مع الضغط على مفتاح Alt. هذا يخلق غموضًا في الحروف الكبيرة والرموز `@[\]^_`، التي ستشكل أكواد C1.
* كونسول يولد `SS3 ''modifiers'' ''char''` عندما يتم الضغط على  مع المفاتيح المعدلة.
* iTerm2 يدعم الإبلاغ عن مفاتيح إضافية عبر وضع CSI u المحسن.

## انظر أيضًا
* المعهد الأمريكي للمعايير الوطنية
* محرف تحكم

## الملاحظات

## المراجع

## الروابط الخارجية
* المعيار ECMA-48، الوظائف التحكمية لمجموعات الحروف المشفرة. (*الطبعة الخامسة، يونيو 1991*)، جمعية مصنعي الحواسيب الأوروبية، جنيف 1991 (تم نشره أيضًا من قبل ISO وIEC كمعيار ISO/IEC 6429)
* vt100.net مستندات DEC
* 
* Xterm / تسلسل الهروب
* AIXterm / تسلسل الهروب
* مجموعة من تسلسل الهروب للطرفيات المتوافقة بشكل غير دقيق مع ECMA-48 وأقرانه.
* 
* توصية ITU-T Rec. T.416 (03/93) تكنولوجيا المعلومات – بنية الوثيقة المفتوحة (ODA) وتنسيق التبادل: بنى محتوى الحروف

تصنيف:معايير الحاسوب
تصنيف:معايير الأيزو
تصنيف:واجهة مستخدم نصية