JavaRush /وبلاگ جاوا /Random-FA /فرار از شخصیت ها

فرار از شخصیت ها

در گروه منتشر شد
سلام! در سخنرانی‌های قبلی، قبلاً با رشته‌هایی آشنا شده‌ایم که توسط کلاس در جاوا نشان داده می‌شوند String. همانطور که احتمالاً به یاد دارید، یک رشته دنباله ای از کاراکترها است. نمادها می توانند هر چیزی باشند - حروف، اعداد، علائم نقطه گذاری و غیره. نکته اصلی این است که هنگام ایجاد یک رشته، کل دنباله در نقل قول قرار می گیرد:
public class Main {
   public static void main(String[] args) {
       String sasha = new String ("Меня зовут Саша, мне 20 лет!");
   }
}
اما چه اتفاقی می افتد اگر ما نیاز به ایجاد رشته ای داشته باشیم که داخل آن نقل قول نیز باشد؟ به عنوان مثال، ما می خواهیم در مورد کتاب مورد علاقه خود به جهان بگوییم:
public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
به نظر می رسد کامپایلر از چیزی ناراضی است! به نظر شما دلیل این خطا چه می تواند باشد و چرا به طور خاص با نقل قول ها رخ داده است؟ واقعیت این است که کامپایلر نقل قول ها را به روشی کاملاً تعریف شده درک می کند، یعنی یک رشته را در آنها می پیچد. و هر بار که شخصیتی را می بیند "، انتظار دارد که همان کاراکتر برای آن دنبال شود و بین آنها متن خطی باشد که او، کامپایلر، باید بسازد. در مورد ما، گیومه های اطراف کلمه "گرگ و میش" در داخل گیومه های دیگر قرار دارند . و وقتی کامپایلر به این قطعه متن می‌رسد، به سادگی نمی‌فهمد که از آن چه می‌خواهد. به نظر می رسد یک نقل قول وجود دارد، به این معنی که باید یک رشته ایجاد کند. اما او در حال حاضر این کار را انجام می دهد! دقیقا دلیلش همینه به بیان ساده، در این مرحله کامپایلر به اشتباه متوجه می شود که از آن چه می خواهد. "یک نقل قول دیگر؟ آیا این نوعی خطا است؟ من قبلاً یک رشته ایجاد می کنم! یا باید یک رشته دیگر ایجاد کنم؟ اوهها...:/" باید به کامپایلر توضیح دهیم که یک نقل قول برای آن دستوری است (" یک رشته ایجاد کنید!")، و زمانی که یک نماد ساده باشد ("نمایش کلمه "گرگ و میش" همراه با علامت نقل قول!"). برای رسیدن به این هدف، جاوا از کاراکتر فرار استفاده می کند . این کار با استفاده از یک کاراکتر خاص انجام می شود. مثل این: \. در زندگی معمولی به آن "بک اسلش" می گویند، اما در جاوا (در ترکیب با شخصیتی که باید فرار کرد) دنباله فرار نامیده می شود . به عنوان مثال، \"اینجاست - یک دنباله کنترل برای نمایش نقل قول ها روی صفحه. با مواجه شدن با چنین ساختاری در داخل کد شما، کامپایلر متوجه خواهد شد که این فقط یک کاراکتر "نقل قول" است که باید روی صفحه نمایش داده شود. بیایید سعی کنیم کد خود را با کتاب تغییر دهیم:
public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
       System.out.println(myFavoriteBook);
   }
}
ما از دو نقل قول "درونی" با یک \. بیایید سعی کنیم روش main()... خروجی کنسول را اجرا کنیم:

Моя любимая книга - "Сумерки" Стефани Майер
عالی، کد دقیقاً همانطور که لازم بود کار کرد! نقل قول ها تنها موردی نیستند که ممکن است به فرار شخصیت نیاز داشته باشیم. به عنوان مثال، ما می خواستیم به کسی در مورد کار خود بگوییم:
public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
و باز هم یک اشتباه! آیا می توانید حدس بزنید که دلیل آن چیست؟ کامپایلر دوباره متوجه نمی شود که چه کاری باید انجام دهد. از این گذشته ، یک نماد \برای او چیزی بیش از یک سکانس کنترل نیست ! انتظار دارد که پس از اسلش، کاراکتری وجود داشته باشد که باید آن را به روشی خاص تفسیر کند (مثلاً یک علامت نقل قول). با این حال، در اینجا \حروف منظم دنبال می شوند. بنابراین کامپایلر دوباره گیج می شود. چه باید کرد؟ دقیقاً مانند دفعه قبل: فقط \یک مورد دیگر را به ما اضافه کنید \!
public class Main {

   public static void main(String[] args) {

       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\\Work Projects\\java");
       System.out.println(workFiles);

   }
}
بیایید ببینیم چه چیزی از این نتیجه می گیرد: خروجی کنسول:

Мои рабочие файлы лежат в папке D:\Work Projects\java
فوق العاده! کامپایلر فوراً تشخیص داد که اینها \نمادهای معمولی هستند که باید به همراه بقیه به کنسول خروجی داده شوند. تعداد کمی از توالی فرار در جاوا وجود دارد. در اینجا لیست کامل آنها آمده است:
  • \t کاراکتر برگه
  • \b یک کاراکتر بازگشتی در متن یک قدم به عقب یا حذف یک کاراکتر در یک خط (backspace).
  • \n شخصیت خط جدید
  • \r کاراکتر بازگشت کالسکه
  • \f اجرای صفحه
  • \' کاراکتر نقل قول تک
  • \" کاراکتر نقل قول دوگانه
  • \\کاراکتر بک اسلش (\).
بنابراین، اگر کامپایلر با نمادی در متن مواجه شود \n، متوجه می‌شود که این فقط یک نماد و حرفی نیست که باید به کنسول خروجی شود، بلکه یک دستور ویژه برای آن است - "یک خط شکسته شود!" برای مثال، اگر بخواهیم قطعه ای از شعر را در کنسول خروجی بگیریم، این ممکن است برای ما مفید باشد:
public class Main {
   public static void main(String[] args) {
       String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
       System.out.println(borodino);
   }
}
و این چیزی است که ما دریافت کردیم: خروجی کنسول:

Скажи-ка, дядя, 
Ведь не даром 
Москва, спаленная пожаром, 
Французу отдана?
دقیقا همان چیزی که لازم است! کامپایلر دنباله فرار را تشخیص داد و یک قطعه آیه را در 4 سطر خروجی داد.

یونیکد

موضوع مهم دیگری که باید در رابطه با فرار کاراکتر بدانید، Unicode است . یونیکد یک استاندارد رمزگذاری کاراکتر است که شامل کاراکترهای تقریباً از تمام زبان های نوشتاری جهان است. به عبارت دیگر، این لیستی از کدهای خاص است که در آن کد تقریباً برای هر کاراکتری از هر زبانی وجود دارد! طبیعتاً این لیست بسیار بزرگ است و هیچ کس آن را از روی قلب یاد نمی گیرد :) اگر علاقه مندید که از کجا آمده است و چرا به آن نیاز است، مقاله آموزنده Habrahabr را بخوانید . همه کدهای کاراکتر در یونیکد "حرف u+ رقم هگزادسیمال" هستند. به عنوان مثال، نماد معروف کپی رایت با کد u00A9 نشان داده شده است . بنابراین، در صورت نیاز به استفاده از این کاراکتر هنگام کار با متن در جاوا، می توانید از آن در متن خود فرار کنید! به عنوان مثال، ما می خواهیم به همه اطلاع دهیم که این سخنرانی متعلق به JavaRush است:
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
خروجی کنسول:

Лекция "Экранирование символов", © 2018 Javarush
عالی، همه چیز درست شد! اما شخصیت های خاص همه چیز نیستند! با استفاده از Unicode و Character escaping می توانید متن نوشته شده به زبان های مختلف را همزمان رمزگذاری کنید. و حتی در چندین گویش مختلف از یک زبان!
public class Main {
   public static void main(String[] args) {

       System.out.println("\u041c\u0430\u0301\u043e " +
               "\u0426\u0437\u044d\u0434\u0443\u0301\u043d " +
               "\u0028\u043a\u0438\u0442\u002e \u0442\u0440\u0430\u0434\u002e " +
               "\u6bdb\u6fa4\u6771\u002c \u0443\u043f\u0440\u002e " +
               "\u6bdb\u6cfd\u4e1c\u002c \u043f\u0438\u043d\u044c\u0438\u043d\u044c\u003a " +
               "\u004d\u00e1\u006f \u005a\u00e9\u0064\u014d\u006e\u0067\u0029 " +
               "\u2014 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 " +
               "\u0433\u043e\u0441\u0443\u0434\u0430\u0440\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 " +
               "\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 " +
               "\u0434\u0435\u044f\u0442\u0435\u043b\u044c \u0058\u0058 \u0432\u0435\u043a\u0430\u002c " +
               "\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u043a " +
               "\u043c\u0430\u043e\u0438\u0437\u043c\u0430\u002e");
   }
}
خروجی کنسول:

Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
در این مثال، با دانستن کدهای کاراکتر، رشته ای متشکل از الفبای سیریلیک و سه (!) نوع مختلف نوشتن حروف چینی - کلاسیک، ساده شده و لاتین (پینیین) نوشتیم. اساساً همین است! اکنون به اندازه کافی در مورد فرار شخصیت می دانید تا از این ابزار در کار خود استفاده کنید :) اگر همه چیز کاملاً واضح نیست، به شما توصیه می کنم این مقاله را بخوانید : افزودنی خوبی خواهد بود.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION