JavaRush /Blog Java /Random-VI /Nhân vật trốn thoát

Nhân vật trốn thoát

Xuất bản trong nhóm
Xin chào! Trong các bài giảng trước, chúng ta đã làm quen với các chuỗi được biểu diễn bằng lớp trong Java String. Có thể bạn còn nhớ, chuỗi là một chuỗi các ký tự. Các ký hiệu có thể là bất cứ thứ gì - chữ cái, số, dấu chấm câu, v.v. Điều chính là khi tạo một chuỗi, toàn bộ chuỗi được đặt trong dấu ngoặc kép:
public class Main {
   public static void main(String[] args) {
       String sasha = new String ("Меня зовут Саша, мне 20 лет!");
   }
}
Nhưng điều gì sẽ xảy ra nếu chúng ta cần tạo một chuỗi có dấu ngoặc kép bên trong? Ví dụ: chúng tôi muốn nói với thế giới về cuốn sách yêu thích của mình:
public class Main {
   public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - "Сумерки" Стефани Майер");
   }
}
Trình biên dịch dường như không hài lòng với điều gì đó! Bạn nghĩ điều gì có thể là nguyên nhân gây ra lỗi và tại sao nó lại xảy ra cụ thể với dấu ngoặc kép? Thực tế là trình biên dịch nhận biết các trích dẫn theo một cách được xác định nghiêm ngặt, cụ thể là nó bao bọc một chuỗi trong đó. Và mỗi khi anh ta nhìn thấy một ký tự ", anh ta mong đợi rằng ký tự đó sẽ theo sau nó, và giữa chúng sẽ có văn bản của dòng mà anh ta, người biên dịch, phải tạo ra. Trong trường hợp của chúng tôi, dấu ngoặc kép xung quanh từ "Chạng vạng" nằm bên trong dấu ngoặc kép khác . Và khi trình biên dịch gặp đoạn văn bản này, nó chỉ đơn giản là không hiểu họ muốn gì từ nó. Có vẻ như có một trích dẫn, nghĩa là nó sẽ tạo ra một chuỗi. Nhưng anh ấy đã làm điều đó rồi! Đây chính xác là lý do. Nói một cách đơn giản, tại thời điểm này trình biên dịch hiểu sai những gì họ muốn từ nó. "Một trích dẫn khác? Đây có phải là một loại lỗi không? Tôi đã tạo một chuỗi rồi! Hay tôi nên tạo một chuỗi khác? Uhhh...:/" Chúng ta cần giải thích cho trình biên dịch khi một trích dẫn là một lệnh cho nó (" tạo một chuỗi!") và khi đó là một ký hiệu đơn giản ("hiển thị từ "Chạng vạng" cùng với dấu ngoặc kép!"). Để đạt được điều này, Java sử dụng tính năng thoát ký tự . Điều này được thực hiện bằng cách sử dụng một ký tự đặc biệt. Như thế này: \. Trong cuộc sống bình thường, nó được gọi là "dấu gạch chéo ngược", nhưng trong Java, nó (kết hợp với ký tự cần thoát) được gọi là chuỗi thoát . Ví dụ: \"đây là - một chuỗi điều khiển để hiển thị các trích dẫn trên màn hình. Khi gặp phải cấu trúc như vậy bên trong mã của bạn, trình biên dịch sẽ hiểu rằng đây chỉ là một ký tự “trích dẫn” cần được hiển thị trên màn hình. Hãy thử thay đổi mã của chúng tôi bằng cuốn sách:
public static void main(String[] args) {
       String myFavoriteBook = new String ("Моя любимая книга - \"Сумерки\" Стефани Майер");
       System.out.println(myFavoriteBook);
   }
}
Chúng tôi đã thoát khỏi hai dấu ngoặc kép "bên trong" bằng \. Hãy thử chạy phương thức main()... Đầu ra của bảng điều khiển:

Моя любимая книга - "Сумерки" Стефани Майер
Tuyệt vời, mã đã hoạt động chính xác như cần thiết! Các trích dẫn không phải là trường hợp duy nhất mà chúng ta có thể cần thoát ký tự. Ví dụ: chúng tôi muốn kể cho ai đó về công việc của mình:
public class Main {
   public static void main(String[] args) {
       String workFiles= new String ("Мои рабочие файлы лежат в папке D:\Work Projects\java");
       System.out.println(workFiles);
   }
}
Và một lần nữa là một sai lầm! Bạn có thể đoán được lý do là gì chưa? Trình biên dịch lại không hiểu phải làm gì. Xét cho cùng, một biểu tượng \đối với anh ta không gì khác hơn là một chuỗi điều khiển ! Nó hy vọng rằng sau dấu gạch chéo sẽ có một số ký tự mà nó sẽ phải diễn giải theo một cách đặc biệt nào đó (ví dụ: dấu ngoặc kép). Tuy nhiên, ở đây \các chữ cái thông thường theo sau. Vì vậy, trình biên dịch lại bị nhầm lẫn. Phải làm gì? Hoàn toàn giống như lần trước: chỉ cần thêm \một cái nữa vào của chúng tôi \!
public class Main {

   public static void main(String[] args) {

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

   }
}
Hãy xem điều gì xảy ra: Đầu ra của bảng điều khiển:

Мои рабочие файлы лежат в папке D:\Work Projects\java
Siêu! Trình biên dịch ngay lập tức xác định rằng đây \là những ký tự thông thường cần được xuất ra bảng điều khiển cùng với phần còn lại. Có khá nhiều chuỗi thoát trong Java. Đây là danh sách đầy đủ của họ:
  • \t ký tự tab.
  • \b một ký tự trả về trong văn bản lùi lại một bước hoặc xóa một ký tự trong một dòng (backspace).
  • \n ký tự dòng mới.
  • \r ký tự trả về vận chuyển.
  • \f chạy trang.
  • \' ký tự trích dẫn đơn.
  • \" ký tự trích dẫn kép.
  • \\ký tự dấu gạch chéo ngược (\).
Do đó, nếu trình biên dịch gặp một ký hiệu trong văn bản \n, nó sẽ hiểu rằng đây không chỉ là một ký hiệu và một chữ cái cần xuất ra bảng điều khiển mà còn là một lệnh đặc biệt dành cho nó - "ngắt dòng!" Ví dụ: điều này có thể hữu ích nếu chúng ta muốn xuất một đoạn thơ ra bảng điều khiển:
public class Main {
   public static void main(String[] args) {
       String borodino = new String ("Скажи-ка, дядя, \nВедь не даром \nМосква, спаленная пожаром, \nФранцузу отдана?");
       System.out.println(borodino);
   }
}
Và đây là những gì chúng tôi nhận được: Đầu ra của bảng điều khiển:

Скажи-ка, дядя, 
Ведь не даром 
Москва, спаленная пожаром, 
Французу отдана?
Chính xác những gì cần thiết! Trình biên dịch đã nhận ra chuỗi thoát và xuất ra một đoạn thơ gồm 4 dòng.

bảng mã Unicode

Một chủ đề quan trọng khác mà bạn cần biết liên quan đến việc thoát ký tự là Unicode . Unicode là một tiêu chuẩn mã hóa ký tự bao gồm các ký tự từ hầu hết các ngôn ngữ viết trên thế giới. Nói cách khác, đây là danh sách các mã đặc biệt, trong đó có mã cho hầu hết mọi ký tự từ bất kỳ ngôn ngữ nào! Đương nhiên, danh sách này rất lớn và không ai học thuộc lòng nó :) Nếu bạn quan tâm đến việc nó đến từ đâu và tại sao nó lại cần thiết, hãy đọc bài viết đầy thông tin trên Habrahabr . Tất cả các mã ký tự trong Unicode đều là “chữ cái u+ chữ số thập lục phân”. Ví dụ: biểu tượng bản quyền nổi tiếng được biểu thị bằng mã u00A9 . Vì vậy, nếu bạn cần sử dụng ký tự này khi làm việc với văn bản trong Java, bạn có thể thoát nó trong văn bản của mình! Ví dụ: chúng tôi muốn cho mọi người biết rằng bài giảng này thuộc bản quyền của JavaRush:
public class Main {
   public static void main(String[] args) {
       System.out.println("Лекция \"Экранирование символов\", \u00A9 2018 Javarush");
   }
}
Đầu ra của bảng điều khiển:

Лекция "Экранирование символов", © 2018 Javarush
Tuyệt vời, mọi thứ đều ổn! Nhưng ký tự đặc biệt không phải là tất cả! Sử dụng Unicode và tính năng thoát ký tự, bạn có thể mã hóa văn bản được viết bằng nhiều ngôn ngữ khác nhau cùng một lúc. Và thậm chí trong một số phương ngữ khác nhau của cùng một ngôn ngữ!
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");
   }
}
Đầu ra của bảng điều khiển:

Ма́о Цзэду́н (кит. трад. 毛澤東, упр. 毛泽东, пиньинь: Máo Zédōng) — китайский государственный и политический деятель XX века, главный теоретик маоизма.
Trong ví dụ này, khi biết mã ký tự, chúng tôi đã viết một chuỗi bao gồm bảng chữ cái Cyrillic và ba (!) kiểu viết ký tự Trung Quốc khác nhau - cổ điển, giản thể và Latin (bính âm). Về cơ bản là vậy! Bây giờ bạn đã biết đủ về tính năng thoát ký tự để sử dụng công cụ này trong công việc của mình :) Nếu mọi thứ vẫn chưa hoàn toàn rõ ràng, tôi khuyên bạn nên đọc bài viết này : nó sẽ là một bổ sung tốt.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION