Đoạn trích bài giảng với người cố vấn trong khóa học của Đại học Codegym. Đăng ký cho khóa học đầy đủ.


"Xin chào, Amigo. Ngày xửa ngày xưa, bạn đã biết rằng để viết một chuỗi ký tự bằng mã, bạn cần đặt chúng trong dấu ngoặc kép."

"Vâng, và điều đó mang lại cho chúng tôi một chuỗi chữ . Cách đây không lâu tôi đã phát hiện ra điều này."

"Trong nghề nghiệp của chúng tôi, đó là một thời gian dài trước đây. Nhưng đó không phải là vấn đề ngay bây giờ. Thay vào đó, hãy cho tôi biết phải làm gì nếu chúng tôi cần dấu ngoặc kép bên trong một chuỗi ký tự?"

"Hmm... Một chuỗi chứa dấu ngoặc kép — còn gì dễ dàng hơn. Tôi chắc rằng có một số cách..."

"Vâng. Giả sử chúng ta muốn hiển thị văn bản "Friends" was nominated for an "Oscar". Chúng ta sẽ làm điều đó như thế nào?"

"Thành thật mà nói, tôi không biết. Tôi không thể nghĩ ra bất cứ điều gì."

"Bạn sẽ không thể có được giải pháp thông qua logic. Hãy để tôi chỉ cho bạn phải làm gì.

Mã số ghi chú
String s = ""Friends" was nominated for an "Oscar"";
Tùy chọn này sẽ không hoạt động!"

"Tùy chọn này sẽ không hoạt động, vì trình biên dịch diễn giải đây là mã hoàn toàn khác:

Mã số ghi chú
String s = ""Friends" was nominated for an "Oscar"";
Tùy chọn này sẽ không hoạt động!"

"Sau khi trình biên dịch gặp dấu ngoặc kép trong mã, nó sẽ coi phần tiếp theo là phần đầu của một chuỗi ký tự. Dấu ngoặc kép tiếp theo biểu thị phần cuối của chuỗi ký tự."

"Vậy làm thế nào để bạn viết dấu ngoặc kép bên trong một chữ?"

"Có một cách. Nó được gọi là ký tự thoát . Bạn chỉ cần viết dấu ngoặc kép trong chuỗi văn bản. Và trước dấu ngoặc kép, bạn thêm ký hiệu \ ( dấu gạch chéo ngược ).

"Đây là giao diện của chuỗi ký tự khi được viết đúng cách:

Mã số ghi chú
String s = "\"Friends\" was nominated for an \"Oscar\"";
Điều này sẽ làm việc!

"Trình biên dịch sẽ giải thích mọi thứ một cách chính xác và sẽ không coi dấu ngoặc kép sau dấu gạch chéo ngược là dấu ngoặc kép thông thường.

"Hơn nữa, nếu bạn xuất chuỗi này ra màn hình, các trích dẫn có dấu gạch chéo ngược sẽ được xử lý chính xác và văn bản sẽ được hiển thị mà không có bất kỳ dấu gạch chéo ngược nào:"Friends" was nominated for an "Oscar"

"Chà, tôi sẽ không nói rằng điều này là siêu tiện lợi ..."

"Nhưng bạn có thể làm gì, đó là các quy tắc. Một điểm quan trọng khác. Dấu ngoặc kép đứng trước dấu gạch chéo ngược đại diện cho một ký tự: chúng tôi chỉ đơn giản sử dụng ký hiệu khéo léo không can thiệp vào khả năng của trình biên dịch để nhận dạng chuỗi ký tự trong văn bản của chúng tôi mã. Bạn có thể gán dấu ngoặc kép cho một charbiến:

Mã số ghi chú
char c = '\"';
\"là một ký tự, không phải hai
char c = '"';
Điều này cũng có thể: dấu ngoặc kép bên trong dấu nháy đơn

Các tình huống thường xảy ra khi thoát nhân vật

"Ngoài dấu ngoặc kép, còn có nhiều ký tự khác mà trình biên dịch xử lý theo cách đặc biệt. Ví dụ: ngắt dòng.

"Làm thế nào để chúng ta thêm ngắt dòng vào một chữ? Ngoài ra còn có một sự kết hợp đặc biệt cho điều này:

\n
Ký tự ngắt dòng

"Nếu bạn cần thêm dấu ngắt dòng vào một chuỗi ký tự, bạn chỉ cần thêm một vài ký tự" \n.

Ví dụ:

Mã số Đầu ra bảng điều khiển
System.out.println("Best regards, \n Anonymous");
             
Best regards,
Anonymous

"Có tổng cộng 8 tổ hợp đặc biệt như thế này, còn được gọi là trình tự thoát hiểm . Chúng ở đây:

Mã số Sự miêu tả
\t Chèn một ký tự tab
\b Chèn một ký tự xóa lùi
\n Chèn ký tự xuống dòng
\r Chèn một ký tự xuống dòng
\f Chèn một ký tự nguồn cấp dữ liệu trang
\' Chèn một dấu nháy đơn
\" Chèn dấu ngoặc kép
\\ Chèn dấu gạch chéo ngược

"Bạn đã cho tôi xem 2 trong số chúng. 6 cái còn lại nghĩa là gì?"

"Tôi sẽ giải thích tất cả ngay bây giờ.

\tlà một ký tự tab

Khi dòng chữ này xuất hiện trong văn bản, nó tương đương với việc nhấn Tabphím trong khi gõ. Nó dịch chuyển văn bản theo sau nó và cho phép căn chỉnh văn bản.

Ví dụ:

Mã số Đầu ra bảng điều khiển
System.out.println("0\t1\t2\t3");
System.out.println("0\t10\t20\t30");
System.out.println("0\t100\t200\t300");
0       1        2        3
0       10       20       30
0       100      200      300

\bcó nghĩa là 'quay lại một ký tự'

Trình tự này trong một chuỗi tương đương với việc nhấn Backspacephím trên bàn phím. Nó xóa ký tự đứng trước nó:

Mã số Đầu ra bảng điều khiển
System.out.println("Hello\b\b World");
Hel World

\rlà ký tự xuống dòng

Ký tự này di chuyển con trỏ đến đầu dòng hiện tại mà không thay đổi văn bản (tùy thuộc vào phiên bản JDK). Bất cứ điều gì tiếp theo được hiển thị tiếp theo sẽ ghi đè lên chuỗi hiện có.

Ví dụ:

Mã số Đầu ra bảng điều khiển
System.out.println("Greetings\r World!"); 
World!ngs

\flà một ký tự nguồn cấp dữ liệu trang

Biểu tượng này đến với chúng ta từ thời của những chiếc máy in ma trận điểm đầu tiên. Việc xuất trình tự này sang máy in sẽ khiến máy in chỉ nạp trang tính hiện tại mà không in bất kỳ văn bản nào cho đến khi một trang mới bắt đầu.

Bây giờ chúng tôi sẽ gọi nó là ngắt trang hoặc trang mới .

\\là một dấu gạch chéo ngược

Mọi thứ đều đơn giản ở đây. Nếu chúng ta sử dụng dấu gạch chéo ngược để thoát các ký tự trong văn bản của mình, thì làm cách nào để chúng ta viết chính ký tự dấu gạch chéo ngược đó trong chuỗi?

Rất đơn giản: thêm dấu gạch chéo ngược vào văn bản — bạn phải viết hai dấu gạch chéo ngược liên tiếp.

Ví dụ:

Mã số Đầu ra bảng điều khiển
System.out.println("c:\projects\my\first");
Trình biên dịch sẽ hét vào mặt bạn vì các ký tự thoát không xác định.
System.out.println("c:\\projects\\my\\first");
Đó là cách nó được thực hiện đúng!

"Dùng dấu gạch chéo đôi cũng hợp lý. Nhưng tôi không thể ghi nhớ ngay mọi thứ khác. Tôi sẽ phải dựa vào gợi ý của bạn."

"Dần dần, bạn sẽ nhớ mình cần gì. Đừng lo. Còn mọi thứ khác, đã có Google.

bảng mã Unicode

"Bạn đã biết rằng mỗi ký tự hiển thị trên màn hình tương ứng với một mã số cụ thể. Một bộ mã được tiêu chuẩn hóa được gọi là mã hóa .

"Ngày xửa ngày xưa, khi máy tính mới được phát minh, bảy bit (ít hơn một byte) là đủ để mã hóa mọi ký tự. Bảng mã đầu tiên chỉ chứa 128 ký tự. Bảng mã này được gọi là ASCII . "

"Đó là một cái tên kỳ lạ."

"Không có gì lạ về nó cả. Nó là một từ viết tắt. ASCII là viết tắt của American Standard Code for Information Interchange - một bảng mã tiêu chuẩn của Mỹ dành cho các ký tự có thể in được và một số mã đặc biệt."

"Nó bao gồm 33 ký tự điều khiển không thể in được (ảnh hưởng đến cách xử lý văn bản và khoảng trắng) và 95 ký tự có thể in được, bao gồm số, chữ hoa và chữ thường Latinh và một số dấu chấm câu.

"Khi máy tính trở nên phổ biến, mỗi quốc gia bắt đầu phát hành bảng mã của riêng mình. Thông thường, họ lấy ASCII làm điểm khởi đầu và thay thế các ký tự ASCII hiếm khi được sử dụng bằng các ký hiệu từ bảng chữ cái tương ứng.

"Theo thời gian, một ý tưởng nảy sinh: tạo một mã hóa duy nhất chứa tất cả các ký tự của mọi mã hóa trên thế giới.

bảng mã Unicode

"Vì vậy, vào năm 1993, bảng mã Unicode đã được tạo ra và ngôn ngữ Java trở thành ngôn ngữ lập trình đầu tiên sử dụng bảng mã này làm tiêu chuẩn để lưu trữ văn bản. Bây giờ Unicode là tiêu chuẩn cho toàn ngành CNTT.

"Mặc dù bản thân Unicode là tiêu chuẩn, nhưng nó có một số biểu diễn hoặc định dạng chuyển đổi Unicode (UTF): UTF-8, UTF-16 và UTF-32, v.v.

"Java sử dụng phiên bản nâng cao của mã hóa Unicode — UTF-16: mỗi ký tự được mã hóa bằng 16 bit (2 byte). Nó có thể chứa tới 65.536 ký tự! Bạn có thể tìm thấy hầu hết mọi ký tự của mọi bảng chữ cái trên thế giới trong mã hóa này. "

"Tôi hy vọng tôi không cần phải biết nó bằng trái tim?"

"Muốn thì đi đi!"

"Được rồi, tốt thôi. Tôi sẽ sử dụng quy tắc này: bạn không thể biết mọi thứ, nhưng bạn có thể Google mọi thứ."

"Áp dụng một cách tiếp cận hợp lý là tất cả. Vì vậy, để viết một ký tự Unicode trong chương trình của bạn bằng mã của nó, bạn cần viết \u+ mã ở dạng thập lục phân . Ví dụ:\u00A9

Mã số Đầu ra bảng điều khiển
 System.out.println("\u00A9 CodeGym");
© CodeGym

Unicode: điểm mã

"640 kilobyte phải là đủ cho tất cả mọi người! Hoặc không". Bill Gates đã từng nói như vậy. Hay không. Ít nhất trích dẫn này được quy cho anh ta."

"Haha. 640 kilobyte thậm chí còn không đủ để tải bộ não của một con robot dọn dẹp."

"Cuộc sống thật khó khăn và theo thời gian, mã hóa UTF-16 bắt đầu không phù hợp. Hóa ra có rất nhiều ngôn ngữ châu Á và chúng có rất nhiều ký tự. Và tất cả các ký tự này đơn giản là không thể nhồi nhét vào 2 byte ."

"Vậy ta phải làm sao?"

"Sử dụng nhiều byte hơn ! Nhưng loại char chỉ có 2 byte và việc thay đổi nó thành 4 không dễ dàng: hàng tỷ dòng mã Java đã được viết trên khắp thế giới, mã này sẽ bị hỏng nếu loại char đột nhiên trở thành 4 byte một Java máy.Vì vậy ta không đổi được kiểu char!

"Có một cách tiếp cận khác. Hãy nhớ cách chúng tôi thoát khỏi các ký tự bằng cách đặt dấu gạch chéo ngược phía trước chúng. Về cơ bản, chúng tôi đã mã hóa một ký tự bằng cách sử dụng nhiều ký tự. Những người tạo ra Java đã quyết định sử dụng cách tiếp cận tương tự.

"Một số ký tự xuất hiện trực quan dưới dạng một ký tự được mã hóa thành hai chars trong một chuỗi:

Mã số Đầu ra bảng điều khiển
System.out.println("\uD83D\uDD0A");
🔊

"Giờ đây, chương trình Java của bạn thậm chí có thể xuất biểu tượng cảm xúc ra bảng điều khiển 😎"

"Tôi chắc chắn sẽ sử dụng nó để vui chơi!"