JavaRush /จาวาบล็อก /Random-TH /ตัวละครที่หลบหนี

ตัวละครที่หลบหนี

เผยแพร่ในกลุ่ม
สวัสดี! Stringในการบรรยายครั้ง ก่อนเราคุ้นเคยกับสตริงซึ่งแสดงโดยคลาสในภาษา Java ดังที่คุณคงจำได้ สตริงคือลำดับของอักขระ สัญลักษณ์อาจเป็นอะไรก็ได้ เช่น ตัวอักษร ตัวเลข เครื่องหมายวรรคตอน และอื่นๆ สิ่งสำคัญคือเมื่อสร้างสตริง ลำดับทั้งหมดจะอยู่ในเครื่องหมายคำพูด:
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 ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
ดูเหมือนว่าคอมไพเลอร์จะไม่พอใจกับบางสิ่ง! คุณคิดว่าอะไรอาจเป็นสาเหตุของข้อผิดพลาด และเหตุใดจึงเกิดขึ้นโดยเฉพาะกับเครื่องหมายคำพูด ความจริงก็คือคอมไพเลอร์รับรู้คำพูดในลักษณะที่กำหนดไว้อย่างเคร่งครัด กล่าวคือ จะมีการล้อมสตริงไว้ และทุกครั้งที่เขาเห็นตัวละคร"เขาคาดหวังว่าตัวละครตัวเดียวกันจะตามมา และระหว่างนั้นก็จะมีข้อความของบรรทัดที่เขาซึ่งเป็นคอมไพเลอร์ต้องสร้างขึ้น ในกรณีของเรา เครื่องหมายคำพูดที่อยู่รอบๆ คำว่า "Twilight" จะอยู่ภายในเครื่องหมายคำพูดอื่นๆ และเมื่อคอมไพเลอร์มาถึงข้อความชิ้นนี้ มันก็ไม่เข้าใจว่าพวกเขาต้องการอะไรจากข้อความนี้ ดูเหมือนว่าจะมีเครื่องหมายคำพูด ซึ่งหมายความว่าควรสร้างสตริง แต่เขาทำไปแล้ว! นี่คือเหตุผลที่แม่นยำ พูดง่ายๆ ก็คือ ณ จุดนี้คอมไพเลอร์เข้าใจผิดว่าพวกเขาต้องการอะไรจากมัน "เครื่องหมายคำพูดอื่น? นี่เป็นข้อผิดพลาดบางประเภทหรือเปล่า ฉันกำลังสร้างสตริงอยู่แล้ว! หรือฉันควรสร้างอีกอันหนึ่งดีล่ะ? เอ่อ...:/" เราต้องอธิบายให้คอมไพเลอร์ฟังเมื่อเครื่องหมายคำพูดเป็นคำสั่งสำหรับมัน (" สร้างสตริง!") และเมื่อเป็นสัญลักษณ์ธรรมดา (“แสดงคำว่า “ทไวไลท์” พร้อมด้วยเครื่องหมายคำพูด!”) เพื่อ ให้บรรลุเป้าหมายนี้ Java ใช้การยกเว้นอักขระ ทำได้โดยใช้อักขระพิเศษ แบบนี้: \. ในชีวิตปกติเรียกว่า "แบ็กสแลช" แต่ใน Java (ร่วมกับอักขระที่จะหลีก) เรียกว่าลำดับหลีก ตัวอย่างเช่น\"นี่คือ - ลำดับการควบคุมสำหรับการแสดงคำพูดบนหน้าจอ เมื่อพบโครงสร้างภายในโค้ดของคุณ คอมไพลเลอร์จะเข้าใจว่านี่เป็นเพียงอักขระ "เครื่องหมายคำพูด" ที่ต้องแสดงบนหน้าจอ ลองเปลี่ยนรหัสของเรากับหนังสือ:
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
สุด ๆ ! คอมไพเลอร์ระบุได้ทันทีว่า\อักขระเหล่านี้เป็นอักขระธรรมดาที่ต้องส่งออกไปยังคอนโซลพร้อมกับส่วนที่เหลือ มี Escape Sequence ค่อนข้างน้อยใน 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เป็นมาตรฐานการเข้ารหัสอักขระที่รวมอักขระจากภาษาเขียนเกือบทั้งหมดของโลก กล่าวอีกนัยหนึ่งนี่คือรายการรหัสพิเศษซึ่งมีรหัสสำหรับอักขระเกือบทุกตัวจากทุกภาษา! โดยปกติแล้วรายการนี้มีขนาดใหญ่มากและไม่มีใครเรียนรู้ด้วยใจ :) หากคุณสนใจว่ามันมาจากไหนและเหตุใดจึงจำเป็น โปรดอ่านบทความที่ให้ข้อมูลเกี่ยวกับHabrahabr รหัสอักขระทั้งหมดใน Unicode คือ "ตัวอักษรu+ เลขฐานสิบหก" ตัวอย่างเช่น สัญลักษณ์ลิขสิทธิ์ อันโด่งดังจะระบุด้วยรหัสu00A9 ดังนั้น หากคุณต้องการใช้อักขระนี้เมื่อทำงานกับข้อความใน Java คุณสามารถหลีกเลี่ยงอักขระนี้ในข้อความของคุณได้! ตัวอย่างเช่น เราต้องการแจ้งให้ทุกคนทราบว่าการบรรยายนี้เป็นลิขสิทธิ์ของ JavaRush:
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
เอาต์พุตคอนโซล:

Лекция "Экранирование символов", © 2018 Javarush
เยี่ยมมาก ทุกอย่างได้ผล! แต่ตัวละครพิเศษไม่ใช่ทุกอย่าง! การใช้ Unicode และการ Escape อักขระ ทำให้คุณสามารถเข้ารหัสข้อความที่เขียนในภาษาต่างๆ ได้ในเวลาเดียวกัน และแม้กระทั่งในภาษาถิ่นที่แตกต่างกันหลายภาษา!
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