สตริงของอักขระสามารถดำรงอยู่ในโลกที่คอมพิวเตอร์เข้าใจเพียงตัวเดียวและศูนย์ได้อย่างไร
ก็…
เช่นเดียวกับที่เราสามารถจับคู่ชื่อโดเมนกับที่อยู่ IP ได้
หรือบาร์โค้ดไปยังสินค้าเฉพาะ
เราทำได้…
แมปตัวเลขกับตัวละคร!
ชอบ 97
ถึง "a"
.
หรือ 122
ถึง "z"
.
นั่นคือวิธีที่เราสามารถมีตัวละครในโลกของตัวเลขได้
แต่ตัวเลขใดที่เข้ากับอักขระใดได้บ้าง
เพื่อตอบคำถามนั้น เราได้คิดค้นระบบการแมปอักขระที่แตกต่างกัน
เริ่มต้นด้วย ASCII
ASCII ย่อมาจาก “American Standard Code for Information Interchange”
คุณค้นหาตาราง ASCII หรือขอให้ Ruby แปลงอักขระเป็นค่า ASCII ได้
ถูกใจสิ่งนี้ :
"a".ord # 97
สำหรับอักขระหลายตัว :
"abc".bytes # [97, 98, 99]
หากคุณมีจำนวนเต็ม คุณสามารถรับอักขระที่เกี่ยวข้องได้
ถูกใจสิ่งนี้ :
97.chr # "a"
การเข้ารหัส ASCII รวมถึง :
- อักขระควบคุม (เช่น ขึ้นบรรทัดใหม่ แท็บ null)
- สัญลักษณ์ (เช่น วงเล็บ เครื่องหมายเท่ากับ เครื่องหมายคำถาม)
- ตัวเลข (0-9)
- ตัวละคร (a-z, A-Z)
ดังที่เราจะเห็นในบทความนี้ต่อไป อักขระช่วงนี้มีจำกัด
ทำไม?
เนื่องจากไม่มีอักขระและสัญลักษณ์จากภาษาอื่น เช่น จีนหรือญี่ปุ่น
ASCII ในโลกแห่งความเป็นจริง
การจับคู่ตัวเลขกับสตริงทั้งหมดนี้เกิดขึ้นเบื้องหลังสำหรับคุณ
แต่มีการใช้งานจริงบ้าง!
ตัวอย่างเช่น :
ข้อกำหนด HTTP ไม่อนุญาตให้มีอักขระบางตัวใน URL
แต่คุณสามารถเข้ารหัสอักขระที่ไม่ถูกต้องเหล่านี้ในรูปแบบ ASCII และเว็บเซิร์ฟเวอร์ที่ทันสมัยส่วนใหญ่จะตีความได้อย่างถูกต้อง
example.com/a+++ => example.com/a%2B%2B%2B
%2B
คืออะไร %2B
?
มันคือตัวอักษร +
ในรูปแบบที่เข้ารหัส ASCII
คุณสามารถใช้ความรู้นี้เพื่อแปลงร่างตัวละครได้
ตัวอย่างเช่น :
หากคุณดูที่ตาราง ASCII คุณจะสังเกตเห็นว่าคุณสามารถแปลงตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่ได้โดยลบ 32 ออกจากตาราง
("a".ord - 32).chr # "A"
วิธีนี้ได้ผลในทางกลับกัน
("A".ord + 32).chr # "a"
ใช่
ใน Ruby เรามี upcase
&ดาวน์เคส
วิธีการ
แต่สิ่งนี้อาจเป็นประโยชน์กับคุณในคำถามสัมภาษณ์ ความท้าทายในการเขียนโค้ด หรือสถานการณ์ที่คล้ายกัน
ยูนิโค้ดคืออะไร
ASCII สามารถเข้ารหัสอักขระที่แตกต่างกันได้สูงสุด 127 ตัว (256 ตัวด้วย ASCII แบบขยาย) ซึ่งจะจำกัดอักขระที่เราสามารถแสดงได้
วิธีแก้ปัญหา?
ยูนิโค้ด
Unicode คือ ระบบเข้ารหัสสตริง ที่สามารถแสดงได้ถึง ล้านตัวอักษรที่แตกต่างกัน .
มีพื้นที่มากกว่า ASCII มาก!
ตอนนี้เราสามารถรวมอักขระจากภาษาต่างๆ สัญลักษณ์ใหม่ หรือแม้แต่อิโมจิได้แล้ว
นี่คือ Unicode บางส่วน :
ɑΩϕβΣπ
เหล่านี้เป็นอักขระจากอักษรกรีกซึ่งไม่สามารถแสดงโดยใช้ ASCII ได้
วิธีใช้ Unicode ใน Ruby
Ruby รองรับ Unicode ซึ่งเปิดใช้งานโดยค่าเริ่มต้นตั้งแต่ Ruby 1.9
คุณก็ทำได้ :
π = 3.141592
หรือนี่ :
def ★★★ puts "You get 3 stars, great job!" end ★★★ # "You get 3 stars, great job!"
สนุกมาก!
แต่อาจใช้ไม่ได้จริงในการกำหนดวิธีการและตัวแปรโดยใช้สัญลักษณ์เหล่านี้เพราะไม่ได้อยู่ในแป้นพิมพ์ของเรา
อันที่จริง มีอักขระ Unicode ที่ถูกต้องและมองไม่เห็น
ตัวอย่าง :
def puts "Invisible method" end
วิธีนี้ดูเหมือนวิธีการที่ไม่มีชื่อ ซึ่งปกติไม่อนุญาต
แต่ใช้งานได้เพราะอักขระ Unicode ที่มองไม่เห็น!
วิธีการเข้ารหัสสตริง
Ruby มีวิธีการทำงานกับระบบเข้ารหัสที่แตกต่างกัน
ตัวอย่างเช่น :
"abc".encoding.name # "UTF-8"
มีบางสถานการณ์พิเศษที่การเข้ารหัสปัจจุบัน (encoding.name
) ไม่ตรงกับการเข้ารหัสจริง ของสายอักขระ
คุณค้นหาข้อมูลนี้ได้ขณะอ่านข้อมูลจากเว็บไซต์ ไฟล์ ฐานข้อมูล หรือแหล่งภายนอกอื่น
ซึ่งจะส่งผลให้ InvalidByteSequenceError
.
หากเป็นเช่นนั้น คุณจะต้องเปลี่ยนการเข้ารหัส .
อย่างไร?
การใช้ เข้ารหัส
วิธีการ:
"abcΣΣΣ".encode("ASCII", "UTF-8", undef: :replace) # "abc???"
ฉันกำลังแปลงจาก UTF-8 (Unicode) เป็น ASCII และเนื่องจาก Σ
ตัวละครไม่สามารถใช้ได้ใน ASCII เราบอกให้ Ruby แทนที่
โดยค่าเริ่มต้น สิ่งนี้จะแทนที่อักขระที่ไม่ได้กำหนดด้วยเครื่องหมายคำถาม
แต่คุณสามารถเปลี่ยนสิ่งนั้นได้
ถูกใจสิ่งนี้ :
"abcΣΣΣ".encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "") # "abc"
หรือใช้ตัวเลือก “ทางเลือก” :
"abcΣΣΣ".encode("ASCII", "UTF-8", fallback: {"Σ" => "E"}) # "abcEEE"
นี่คือคำพูด :
“แทนที่อักขระทั้งหมดจาก UTF-8 (Unicode) เป็น ASCII ใช้แฮชสำรองเพื่อแปลอักขระที่ไม่มีอยู่ใน ASCII”
อีกวิธี force_encoding
, เปลี่ยนการเข้ารหัสโดยไม่มีขั้นตอนการแปลนี้
ตัวอย่าง :
"abc½½½".force_encoding("iso-8859-1")
คุณรับรายการการเข้ารหัสที่ใช้ได้โดยใช้ Encoding.aliases
วิธีการ
สรุป
คุณได้เรียนรู้วิธีที่คอมพิวเตอร์สร้างตัวอักษรจากตัวเลขโดยใช้ตารางการเข้ารหัส! คุณยังได้เรียนรู้เกี่ยวกับ ASCII และ Unicode ใน Ruby ด้วย
ตอนนี้เปิดโปรแกรมแก้ไขของคุณและสนุกกับการฝึกฝน 😃
ขอบคุณสำหรับการอ่าน