بکندباز

کاراکتر escape چیست؟

همانطور که احتمالاً به یاد دارید، یک رشته دنباله ای از کاراکترها است. این کاراکترها می توانند هر حرف، اعداد، علائم نگارشی و غیره باشند. نکته اصلی هنگام ایجاد یک رشته این است که کل دنباله باید در علامت کوتیشن قرار گیرد:

(در این مقاله تمامی مثال ها به زبان جاوا آورده شده است اما تقریباً برای تمام زبان ها به همین شکل است)

public class Main {
   public static void main(String[] args) {
       String alex = new String ("My name is Alex. I'm 20!");
   }
}

اما اگر نیاز به ایجاد رشته ای داشته باشیم که خودش باید دارای علامت نقل قول باشد، چه کنیم؟ برای مثال، فرض کنید می‌خواهیم درباره کتاب مورد علاقه‌تان به دنیا بگوییم:

public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is "Twilight" by Stephanie Meyer");
   }
}

به نظر می رسد کامپایلر از چیزی ناراضی است! به نظر شما مشکل از چه چیزی می تواند باشد؟ و چه ربطی به کوتیشن دارد؟

در واقع، همه چیز بسیار ساده است. کامپایلر کوتیشن ها را به روشی بسیار خاص تفسیر می کند، یعنی انتظار دارد رشته هایی در آنها پیچیده شود. و هر بار که کامپایلر “” را می بیند، انتظار دارد که پس از علامت کوتیشن یک علامت کوتیشن دوم قرار گیرد و محتوای بین آنها متن رشته ای باشد که باید توسط کامپایلر ایجاد شود.

در مورد ما، علامت کوتیشن در اطراف کلمه “Twilight” در داخل کوتیشن های دیگر قرار دارد. وقتی کامپایلر به این قطعه از متن می رسد، به سادگی نمی فهمد که انتظار می رود چه کاری انجام دهد. علامت کوتیشن نشان می دهد که باید یک رشته ایجاد شود. اما کامپایلر پیش از آن با کوتیشن قبلی، یک رشته را شروع کرده است!

باید به کامپایلر اطلاع دهیم که چه زمانی علامت کوتیشن یک دستور است ( “دستوری برای ایجاد رشته!”) و چه زمانی فقط یک کاراکتر است (“که باید عیناً چاپ شود”).

برای انجام این کار، از کاراکتر escape استفاده می کنیم . اینکار با استفاده از یک نماد خاص انجام می شود: \ . این نماد “بک اسلش” نامیده می شود.

بک اسلشِ ترکیب شده با کاراکتری که قرار است “Escape” شود ، “دنباله کنترلی” نامیده می شود . به عنوان مثال، \" یک دنباله کنترلی برای نمایش علامت کوتیشن روی صفحه است. پس از مواجهه با این ساختار در کد شما، کامپایلر متوجه خواهد شد که این فقط یک علامت کوتیشن است که باید روی صفحه نمایش داده شود. بیایید سعی کنیم کد خود را با این شیوه تغییر دهیم:

public static void main(String[] args) {
       String myFavoriteBook = new String ("My favorite book is \"Twilight\" by Stephanie Meyer");
       System.out.println(myFavoriteBook);
   }
}

ما از \ برای escape از دو علامت کوتیشن “داخلی” خود استفاده کرده ایم.

اگر متد main() را اجرا کنیم، خروجی کنسول برابر خواهد بود با:

My favorite book is “Twilight” by Stephanie Meyer

کد دقیقاً همانطور که می خواستیم کار می کند! کوتیشن ها تنها کاراکتر هایی نیستند که ممکن است نیاز به escape داشته باشیم.

فرض کنید می خواهیم دایرکتوری مربوط به یک پروژه را در کامپیوتر خود چاپ کنیم:

public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("My work files are in D:\Work Projects\java");
       System.out.println(workFiles);
   }
}

یک خطای دیگر!

می توانید حدس بزنید چرا؟ بار دیگر، کامپایلر متوجه نمی شود که چه کاری باید انجام دهد. از این گذشته، کامپایلر \ را به‌عنوان چیزی غیر از یک دنبال کنترلی نمی‌شناسد!

انتظار دارد که بعد از بک اسلش، یک کاراکتر مشخص قرار بگیرد و آن را escape کند نه اینکه خود یک کاراکتر باشد.

بنابراین کامپایلر دوباره گیج می شود. چه کار باید بکنیم؟ دقیقاً همان چیزی که قبلاً وجود داشت: فقط یک \ دیگر به \ خود اضافه می کنیم !

public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("My work files are in D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}

بیایید ببینیم چه چیزی دریافت می کنیم:

My work files are in D:\Work Projects\java

کامپایلر بلافاصله تعیین می کند که \ های درون متن، کاراکترهای معمولی هستند که باید همراه با بقیه نمایش داده شوند. دنباله های کنترلی بسیار زیادی در برنامه نویسی وجود دارد. این لیست کامل آن است:

  • \t – تب.
  • \b – بک اسپیس (گامی به عقب در متن یا حذف یک کاراکتر).
  • \n – خط جدید.
  • \r – برگشت نورد. ()
  • \f – فید فرم.
  • \' تک کوتیشن
  • \" دابل کوتیشن
  • \\ بک اسلش

بنابراین، اگر کامپایلر با \n در متن مواجه شود، متوجه می‌شود که این فقط یک علامت و یک حرف برای نمایش در کنسول نیست، بلکه یک دستور ویژه برای “انتقال به یک خط جدید!” است. به عنوان مثال، اگر بخواهیم بخشی از یک شعر را نمایش دهیم، ممکن است مفید باشد:

public class Main {
   public static void main(String[] args) {
       String byron = new String ("She walks in beauty, like the night, \nOf cloudless climes and starry skies\nAnd all that's best of dark and bright\nMeet in her aspect and her eyes...");
       System.out.println(byron);
   }
}

خروجی ما:

She walks in beauty, like the night,

Of cloudless climes and starry skies

And all that’s best of dark and bright

Meet in her aspect and her eyes…

escape از کاراکترهای یونیکد

موضوع مهم دیگری که باید در رابطه با کاراکترهای escape بدانید Unicode است. یونیکد یک رمزگذاری کاراکتر استاندارد است که شامل نمادهایی برای تقریباً هر زبان نوشتاری در جهان است. به عبارت دیگر، لیستی از کدهای ویژه است که تقریباً هر کاراکتر را در هر زبانی نشان می دهد!

همه کدهای کاراکتر یونیکد به شکل ” u+< رقم هگزا دسیمال>” نوشته می شوند. به عنوان مثال، نماد معروف کپی رایت با u00A9 نشان داده می شود. بنابراین، اگر هنگام کار با متن در برنامه نویسی نیاز به استفاده از این کاراکتر دارید، می توانید از آن در متن خود escape کنید! به عنوان مثال، ما می خواهیم یک متن کپی رایت را در زیر چاپ کنیم:

public class Main {
   public static void main(String[] args) {
       System.out.println("\"Escaping characters\", \u00A9 2019 CodeGym");
   }
}

خروجی:

“Escaping characters”, © 2019 CodeGym

عالی، همه چیز درست شد! اما این کد فقط در مورد نمادهای خاص نیست! می توانید از یونیکد و کاراکترهای escape برای رمزگذاری متن نیز استفاده کنید و هر حرف را به شکل یونیکد آن بنویسید.

public class Main {
   public static void main(String[] args) {

       System.out.println("\u004d\u0061\u006f \u005a\u0065\u0064\u006f\u006e\u0067 " +

               "\u0028\u0054\u0072\u0061\u0064\u0069\u0074\u0069\u006f\u006e\u0061\u006c " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6fa4\u6771\u002c " +

               "\u0053\u0069\u006d\u0070\u006c\u0069\u0066\u0069\u0065\u0064 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065\u003a \u6bdb\u6cfd\u4e1c\u002c " +

               "\u0050\u0069\u006e\u0079\u0069\u006e\u003a \u004d\u00e1\u006f " +

               "\u005a\u00e9\u0064\u014d\u006e\u0067\u0029 \u0077\u0061\u0073 \u0061 " +

               "\u0032\u0030\u0074\u0068\u002d\u0063\u0065\u006e\u0074\u0075\u0072\u0079 " +

               "\u0043\u0068\u0069\u006e\u0065\u0073\u0065 " +

                "\u0073\u0074\u0061\u0074\u0065\u0073\u006d\u0061\u006e\u002c " +

               "\u0070\u006f\u006c\u0069\u0074\u0069\u0063\u0069\u0061\u006e\u002c " +

               "\u0061\u006e\u0064 \u0074\u0068\u0065 \u0063\u0068\u0069\u0065\u0066 " +

               "\u0074\u0068\u0065\u006f\u0072\u0065\u0074\u0069\u0063\u0069\u0061\u006e " +

               "\u006f\u0066 \u004d\u0061\u006f\u0069\u0073\u006d\u002e");
   }
}

خروجی:

Mao Zedong (Traditional Chinese: 毛澤東, Simplified Chinese: 毛泽东, Pinyin: Máo Zédōng) was a 20th-century Chinese statesman, politician, and the chief theoretician of Maoism.

در این مثال، ما از کدهای کاراکتر برای ساخت یک رشته متشکل از انگلیسی و سه نوع مختلف نویسه چینی – سنتی، ساده و لاتین استفاده کردیم.

backendbaz

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*