Yangi \e - escape ketma-ketligi
Tags: csharp, news, features, dotnet
Published: 2024-05-28 04:08:42

Yangi escape ketma-ketligi(escape sequence) haqida gapirishdan oldin, o'zim uchunham yangilik bo'lgan bir tushuncha haqida aytishni shart deb bildim.
Shu kungacha, shaxsan men uchun birxil manoga ega bolgan, ko'plab dasturlash tillarida, hususan C# daham, escape belgi(**character**) hamda escape ketma-ketligi(**sequence**) degan ikkita **bir-biridan farq qildigon**, lekin uzviy bog'liq konsepsiyalarni farqi nimada ekanligini iloji boricha qisqacha tushuntirishga harakat qilaman.
Escape character(belgi) deb `\` **backslash** ni aytiladi. Bu o'zi nima uchun kerak?! Hechkimga sir emaski double quotes `""` hamda backslash `\`, maxsus belgilar hisoblanib, ularni `string` malumot turiga shunchaki saqlab keta olmaymiz. Sababi ushbu belgilarni kompilyatorda boshqa maqsad uchun ishlatilinadi. 

Misol:
```C#
// error
string str1 = "Shoqasim "yaxshi" bola";
string str2 = "Shoqasim \yaxshi\ bola";
```
Bu kodimiz hatolik keltirib chiqaradi, ushbu hatolikni oldini olish uchun, bizga `\` escape -> qochish belgisi yordam beradi(hatolikdan qochishga yo'l ochib beradi).

Misol:
```C#
string str1 = "Shoqasim \"yaxshi\" bola"; 
string str2 = "Shoqasim \\yaxshi\\ bola";

Console.WriteLine(str1); --> Shoqasim "yaxshi" bola
Console.WriteLine(str2); --> Shoqasim \yaxshi\ bola
```
Misolda ko'rganimiz kabi **qo'sh tirnoq** `"` yoki **orqa chiziq** 
`\` belgilarini hatoliklarsiz saqlash uchun bizga **escape character** yordam berdi. Lekin bu yerda yana bir qo'shimcha qilish kerakki `\"`, yoki `\\` belgilari, bundan buyog'iga escape character emas balki **escape sequence** deyiladi. Bu bilan demoqchi bolganim shundaki escape character doimo bitta **backslash** `\`, va ushbu `\` belgi, escape sequence lar yaratishga yo'l beradi. Escape sequence larni turlari ko'p, eng ko'p uchraydigonlari: `\"`, `\\`, `\n`, `\t`, `\r` va boshqalar. Ushbu ketma-ketliklar bizga `string` qiymatlarini turli hil formatlash(shakllash)ga yordam beradi. Ko'proq misollar uchun -> [havola](https://codebuns.com/csharp-basics/escape-sequences/).

Endi ushbu postimizni asosiy qaxramoni bo'lmish `\e` escape sequence ga o'tsak. Ushbu yangi sequence, 13-chi versiyadan oldingi **ESCAPE** belgisi([ASCII](https://www.commfront.com/pages/ascii-chart) jadvali bo'yicha 27-chi)ni ifodalovchi `\x1b` sequence orniga kelishi kutilmoqda.
Bu belgi nimani bildiradi degan savolga kodda javob berishga harakat qilaman.

```C#
Console.WriteLine("\x1b");
// output -> Bo'm-bo'sh bolib qoladi
```
Outputda hich-narsa ko'rinmasligini sababi, `x1b` (ESC) belgisi asosan konsolga chiqishi kerak bolgan matinni **manipulyatsiya** qilish uchun ishlatiladi(rangini o'zgartirish, formatini o'zgartirish vaho-kazo...).

Misol:

```C#
Console.WriteLine("\x1b[31mHello \x1b[0mWorld!");
// output -> Hello(qizil rangda)  World!(defolt rangda)
Console.WriteLine("\x1bHello \x1bWorld!");
// output -> ello orld! birinchi harflar o'chib ketadi
```

Hattoki Microsoft o'z documentationida `\x1b` ishlatishni maslaxat bermaydi. Bunga sabab `1b` ketma-ketligidan keyin keluvchi qiymatlar **o'n oltilik** sanoq tizimini qiymatiga teng bo'lib qolishi mumkin va kutilmagan natijalarni keltirib chiqarishi mumkin.

Misol:
```C#
Console.WriteLine("\x1b12");
// output -> ? belgisi
``` 
Shunaqangi kutilmagan xatoliklar oldini olish maqsadida Microsoft `\x1b` sequensini `\e` o'zgartirmoqchi. Yangi ketma-ketlikni endi ikkilanmay `\e12` qilib ishlatsa bo'ladi, hechqanday **?** belgisi chiqmaydi. Formatlash sistemasixam eski sequence nikidek qoladi.

Misol:
```C#
Console.WriteLine("\e12");
// output -> 2
Console.WriteLine($"\e[31m123\e[0m456");
123(qizil rangda) 456 (defolt rangda)
```