1. เหตุผลในการหลบหนีตัวละคร

กาลครั้งหนึ่งนานมาแล้ว คุณได้เรียนรู้ว่าในการเขียนสตริงของอักขระในโค้ด คุณต้องใส่เครื่องหมายคำพูดคู่ ผลลัพธ์คือสตริงตัวอักษร

แต่เราจะทำอย่างไรหากต้องการเครื่องหมายคำพูดภายในสตริงตัวอักษร สตริงที่มีเครื่องหมายคำพูด — อะไรจะง่ายกว่านี้

สมมติว่าเราต้องการแสดง"Friends" was nominated for an "Oscar"ข้อความ คุณทำอย่างนั้นได้อย่างไร?

รหัส หมายเหตุ
String s = ""Friends" was nominated for an "Oscar"";
ตัวเลือกนี้จะไม่ทำงาน!

ปัญหาคือคอมไพเลอร์คิดว่าคุณกำลังเขียนโค้ดที่ไม่คาดคิดทั้งหมด:

รหัส หมายเหตุ
String s = ""Friends" was nominated for an "Oscar"";
ตัวเลือกนี้จะไม่ทำงาน!

หลังจากที่คอมไพลเลอร์พบเครื่องหมายอัญประกาศคู่ในโค้ด คอมไพลเลอร์จะถือว่าสิ่งต่อไปนี้เป็นจุดเริ่มต้นของสตริงลิเทอรัล เครื่องหมายอัญประกาศคู่ถัดไประบุจุดสิ้นสุดของตัวอักษรสตริง

คุณจะเขียนเครื่องหมายคำพูดคู่ภายในตัวอักษรได้อย่างไร?


2. การหลบหนีตัวละคร

มีวิธีการ เรียกว่าอักขระหนี คุณเพียงแค่เขียนเครื่องหมายคำพูดภายในสตริงข้อความ และก่อนเครื่องหมายคำพูด ให้คุณเพิ่ม เครื่องหมาย \( แบ็กสแลช )

นี่คือลักษณะตัวอักษรของสตริงเมื่อเขียนอย่างถูกต้อง:

รหัส หมายเหตุ
String s = "\"Friends\" was nominated for an \"Oscar\"";
สิ่งนี้จะได้ผล!

คอมไพเลอร์จะตีความทุกอย่างถูกต้องและจะไม่ถือว่าเครื่องหมายคำพูดหลัง เครื่องหมาย แบ็กสแลชเป็นเครื่องหมายคำพูดปกติ

ยิ่งไปกว่านั้น หากคุณส่งออกสตริงนี้ไปที่หน้าจอ คำพูดที่มีแบ็กสแลชจะได้รับการประมวลผลอย่างถูกต้อง และข้อความจะแสดงโดยไม่มีแบ็กสแลช:"Friends" was nominated for an "Oscar"

อีกจุดสำคัญ เครื่องหมายอัญประกาศที่นำหน้าด้วยเครื่องหมายแบ็กสแลชแสดงถึงอักขระตัวเดียว: เราใช้เครื่องหมายง่ายๆ ที่ไม่ขัดขวางความสามารถของคอมไพเลอร์ในการจดจำตัวอักษรสตริงในโค้ดของเรา คุณสามารถกำหนดคำพูดให้กับcharตัวแปร:

รหัส หมายเหตุ
char c = '\"';
\"เป็นตัวละครเดียวไม่ใช่สองตัว
char c = '"';
นอกจากนี้ยังเป็นไปได้: เครื่องหมายอัญประกาศคู่ภายในอัญประกาศเดี่ยว

3. สถานการณ์ทั่วไปที่เกิดขึ้นเมื่อหลบหนีตัวละคร

สถานการณ์ทั่วไปที่เกี่ยวข้องกับการหลบหนีอักขระ

นอกจากเครื่องหมายอัญประกาศคู่แล้ว ยังมีอักขระอื่นๆ อีกมากมายที่คอมไพเลอร์จัดการในลักษณะพิเศษ ตัวอย่างเช่น ตัวแบ่งบรรทัด

เราจะเพิ่มตัวแบ่งบรรทัดให้กับตัวอักษรได้อย่างไร นอกจากนี้ยังมีชุดค่าผสมพิเศษสำหรับสิ่งนี้:

\n
อักขระตัวแบ่งบรรทัด

หากคุณต้องการเพิ่มตัวแบ่งบรรทัดให้กับตัวอักษรของสตริง คุณเพียงแค่เพิ่มอักขระสองสามตัว\n:

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
System.out.println("Best regards, \n Anonymous");
Best regards,
Anonymous

มีชุดค่าผสมพิเศษทั้งหมด 8 ชุดเช่นนี้ ซึ่งเรียกอีกอย่างว่าEscape Sequence พวกเขาอยู่ที่นี่:

รหัส คำอธิบาย
\t แทรกอักขระแท็บ
\b แทรกอักขระย้อนกลับ
\n แทรกอักขระขึ้นบรรทัดใหม่
\r ใส่อักขระขึ้นบรรทัดใหม่
\f แทรก อักขระ ฟีดหน้า
\' ใส่เครื่องหมายอัญประกาศเดี่ยว
\" ใส่เครื่องหมายอัญประกาศคู่
\\ ใส่แบ็กสแลช

คุณคุ้นเคยกับสองคนนี้ แต่อีก 6 คนหมายถึงอะไร

\tเป็นอักขระแท็บ

เมื่อข้อความนี้ปรากฏในข้อความ จะเทียบเท่ากับการกดTabปุ่มขณะพิมพ์ มันเลื่อนข้อความที่ตามมาและทำให้สามารถจัดแนวข้อความได้

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
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

\bหมายถึง 'ย้อนกลับหนึ่งตัวอักษร'

ลำดับนี้ในสตริงเทียบเท่ากับการกดBackspaceปุ่มบนแป้นพิมพ์ มันลบอักขระที่อยู่ข้างหน้า:

รหัส เอาต์พุตคอนโซล
System.out.println("Hello\b\b World");
Hell World!

\rเป็นอักขระกลับรถ

อักขระนี้จะเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดปัจจุบันโดยไม่เปลี่ยนข้อความ สิ่งถัดไปที่แสดงถัดไปจะเขียนทับสตริงที่มีอยู่

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
System.out.println("Greetings\r World!");
World!

\fเป็นตัวอักษรหน้าฟีด

สัญลักษณ์นี้มาถึงเราตั้งแต่ยุคของเครื่องพิมพ์ดอทเมตริกซ์เครื่องแรก การแสดงลำดับนี้ไปยังเครื่องพิมพ์จะทำให้เครื่องพิมพ์ป้อนแผ่นงานปัจจุบันโดยไม่ต้องพิมพ์ข้อความใดๆ จนกว่าจะเริ่มหน้าใหม่

ตอนนี้เราจะเรียกมันว่าตัวแบ่งหน้าหรือหน้าใหม่

\\เป็นแบ็กสแลช

ทุกอย่างตรงไปตรงมาที่นี่ หากเราใช้เครื่องหมายแบ็กสแลชเพื่อหลีกอักขระในข้อความ เราจะเขียนอักขระแบ็กสแลชในสตริงได้อย่างไร

ง่ายมาก: เพิ่มเครื่องหมายแบ็กสแลชให้กับข้อความ — คุณต้องเขียนสองตัวติดกัน

ตัวอย่าง:

รหัส เอาต์พุตคอนโซล
System.out.println("c:\projects\my\first");
คอมไพเลอร์จะตะโกนใส่คุณสำหรับอักขระที่ไม่รู้จักที่หลบหนี
System.out.println("c:\\projects\\my\\first");
เท่านี้ก็เรียบร้อย!


4. การเข้ารหัส Unicode

ดังที่คุณทราบแล้ว อักขระแต่ละตัวที่แสดงบนหน้าจอจะสอดคล้องกับรหัสตัวเลขเฉพาะ ชุดรหัสที่เป็นมาตรฐานเหล่านี้เรียกว่าการเข้ารหัส

กาลครั้งหนึ่งนานมาแล้ว เมื่อคอมพิวเตอร์ถูกประดิษฐ์ขึ้นใหม่ เจ็ดบิต (น้อยกว่าหนึ่งไบต์) ก็เพียงพอที่จะเข้ารหัสอักขระทุกตัว การเข้ารหัสครั้งแรกมีอักขระเพียง 128 ตัว การเข้ารหัสนี้เรียกว่าASCII

ASCIIย่อมาจาก American Standard Code for Information Interchange ซึ่งเป็นตารางรหัสอเมริกันมาตรฐานสำหรับอักขระที่พิมพ์ได้และรหัสพิเศษบางตัว

ประกอบด้วยอักขระควบคุมที่ไม่สามารถพิมพ์ได้ 33 ตัว (ซึ่งส่งผลต่อวิธีประมวลผลข้อความและช่องว่าง) และอักขระที่สามารถพิมพ์ได้ 95 ตัว รวมถึงตัวเลข ตัวอักษรละตินตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก และเครื่องหมายวรรคตอนหลายตัว

การเข้ารหัส Unicode

เมื่อคอมพิวเตอร์ได้รับความนิยมมากขึ้น แต่ละประเทศก็เริ่มเผยแพร่การเข้ารหัสของตนเอง โดยปกติแล้ว พวกเขาใช้ ASCII เป็นจุดเริ่มต้นและแทนที่อักขระ ASCII ที่ไม่ค่อยได้ใช้ด้วยสัญลักษณ์จากตัวอักษรที่เกี่ยวข้อง

เมื่อเวลาผ่านไป เกิดแนวคิด: สร้างการเข้ารหัสเดียวที่มีอักขระทั้งหมดของการเข้ารหัสทั้งหมดในโลก

การเข้ารหัสยูนิโค้ด1

ดังนั้น ในปี 1993 การเข้ารหัส Unicodeจึงถูกสร้างขึ้น และภาษา Java กลายเป็นภาษาโปรแกรมแรกที่ใช้การเข้ารหัสนี้เป็นมาตรฐานในการจัดเก็บข้อความ ปัจจุบัน Unicode เป็นมาตรฐานสำหรับอุตสาหกรรมไอทีทั้งหมด

แม้ว่า Unicode จะเป็นมาตรฐาน แต่ก็มีรูปแบบการแปลง Unicode (UTF) หลายรูปแบบ ได้แก่ UTF-8, UTF-16 และ UTF-32 เป็นต้น

Java ใช้การเข้ารหัส Unicode เวอร์ชันขั้นสูง — UTF-16: อักขระแต่ละตัวเข้ารหัสใน 16 บิต (2 ไบต์) รองรับได้ถึง 65,536 ตัวอักษร!

คุณสามารถค้นหาอักขระเกือบทุกตัวจากทุกตัวอักษรในโลกได้ในการเข้ารหัสนี้ โดยธรรมชาติแล้วไม่มีใครจดจำสิ่งทั้งหมดได้ คุณไม่สามารถรู้ทุกอย่าง แต่คุณสามารถ google ได้ทุกอย่าง

ในการเขียนอักขระ Unicode ใน โปรแกรมของคุณโดยใช้รหัส คุณต้องเขียน\u+ รหัสเป็นเลขฐานสิบหก ตัวอย่างเช่น,\u00A9

รหัส เอาต์พุตคอนโซล
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode: จุดรหัส

"640 กิโลไบต์ควรจะเพียงพอสำหรับทุกคนหรือไม่" (อ้างอิงจาก Bill Gates)

ชีวิตนั้นยากลำบาก และเมื่อเวลาผ่านไป การเข้ารหัส UTF-16 เริ่มไม่เพียงพอ ปรากฎว่ามีภาษาเอเชียจำนวนมากและมีสัญลักษณ์มากมาย และร่ายมนตร์เหล่านี้ไม่สามารถอัดเป็น 2 ไบต์ได้

ทำอะไรได้บ้าง? ใช้ไบต์มากขึ้น !

แต่ประเภทถ่านมีเพียง 2 ไบต์และการเปลี่ยนเป็น 4 นั้นไม่ใช่เรื่องง่าย: มีการเขียนโค้ด Java หลายพันล้านบรรทัดทั่วโลก ซึ่งจะเสียหายหากประเภทถ่านกลายเป็น 4 ไบต์ในเครื่อง Java เราจึงเปลี่ยนประเภทถ่านไม่ได้!

มีอีกแนวทางหนึ่ง จำวิธีที่เราหลีกเลี่ยงอักขระด้วยการใส่เครื่องหมายแบ็กสแลชไว้หน้าอักขระเหล่านั้น โดยพื้นฐานแล้ว เราเข้ารหัสอักขระตัวเดียวโดยใช้อักขระหลายตัว

ผู้สร้าง Java ตัดสินใจใช้วิธีเดียวกัน

อักขระบางตัวที่ปรากฏเป็นภาพเดียวจะถูกเข้ารหัสเป็นcharอักขระสองตัวในสตริง:

รหัส เอาต์พุตคอนโซล
System.out.println("\uD83D\uDD0A");
🔊

ตอนนี้โปรแกรม Java ของคุณสามารถส่งออกอิโมจิไปยังคอนโซลได้แล้ว 😎