JavaRush /בלוג Java /Random-HE /דמויות בורחות

דמויות בורחות

פורסם בקבוצה
שלום! בהרצאות קודמות, כבר הכרנו מחרוזות, המיוצגות על ידי הכיתה ב-Java 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 ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
נראה שהמהדר לא מרוצה ממשהו! מה לדעתך יכולה להיות הסיבה לשגיאה, ולמה היא התרחשה דווקא עם מרכאות? העובדה היא שהמהדר תופס ציטוטים בצורה מוגדרת בהחלט, כלומר, הוא עוטף בהם מחרוזת. ובכל פעם שהוא רואה דמות ", הוא מצפה שאותה דמות תבוא אחריה, וביניהם יהיה טקסט השורה שהוא, המהדר, חייב ליצור. במקרה שלנו, המרכאות סביב המילה "דמדומים" נמצאים בתוך מרכאות אחרות . וכשהמהדר מגיע לקטע הטקסט הזה, הוא פשוט לא מבין מה הם רוצים ממנו. נראה שיש ציטוט, מה שאומר שהוא צריך ליצור מחרוזת. אבל הוא כבר עושה את זה! זו בדיוק הסיבה. במילים פשוטות, בשלב זה המהדר לא מבין מה הם רוצים ממנו. "עוד ציטוט? האם זו איזושהי שגיאה? אני כבר יוצר מחרוזת! או שצריך ליצור עוד אחד? אההה...:/" אנחנו צריכים להסביר למהדר מתי ציטוט הוא פקודה עבורו (" ליצור מחרוזת!"), וכאשר מדובר בסמל פשוט ("הצג את המילה "דמדומים" יחד עם מרכאות!"). כדי להשיג זאת, Java משתמשת ב-chart escape . זה נעשה באמצעות תו מיוחד. ככה: \. בחיים הרגילים זה נקרא "לאחור", אבל בג'אווה זה (בשילוב עם התו שיש לברוח) נקרא רצף בריחה . לדוגמה, \"הנה זה - רצף בקרה להצגת מרכאות על המסך. לאחר שנתקל בבנייה כזו בתוך הקוד שלך, המהדר יבין שזהו רק תו "ציטוט" שצריך להציג על המסך. בואו ננסה לשנות את הקוד שלנו עם הספר:
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

נושא חשוב נוסף שאתה צריך לדעת עליו בקשר לבריחת תווים הוא Unicode . Unicode הוא תקן קידוד תווים הכולל תווים כמעט מכל השפות הכתובות בעולם. במילים אחרות, מדובר ברשימת קודים מיוחדים, שבהם יש קוד כמעט לכל תו מכל שפה! מטבע הדברים, הרשימה הזו מאוד גדולה ואף אחד לא לומד אותה בעל פה :) אם אתם מתעניינים מאיפה היא הגיעה ולמה היא הייתה נחוצה, קראו את המאמר האינפורמטיבי על הברהבר . כל קודי התווים ב-Unicode הם "אות u+ ספרה הקסדצימלית". לדוגמה, סמל זכויות היוצרים המפורסם מצוין בקוד u00A9 . לכן, אם אתה צריך להשתמש בתו הזה כשאתה עובד עם טקסט ב-Java, אתה יכול לברוח ממנו בטקסט שלך! לדוגמה, אנו רוצים ליידע את כולם שההרצאה הזו מוגנת בזכויות יוצרים על ידי JavaRush:
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
פלט מסוף:

Лекция "Экранирование символов", © 2018 Javarush
מעולה, הכל הסתדר! אבל דמויות מיוחדות זה לא הכל! באמצעות Unicode והרחקת תווים, אתה יכול לקודד טקסט שנכתב בשפות שונות בו-זמנית. ואפילו בכמה דיאלקטים שונים של אותה שפה!
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