Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ทำความเข้าใจ Ruby:การเข้ารหัสสตริง, ASCII &Unicode

สตริงของอักขระสามารถดำรงอยู่ในโลกที่คอมพิวเตอร์เข้าใจเพียงตัวเดียวและศูนย์ได้อย่างไร

ก็…

เช่นเดียวกับที่เราสามารถจับคู่ชื่อโดเมนกับที่อยู่ 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 ด้วย

ตอนนี้เปิดโปรแกรมแก้ไขของคุณและสนุกกับการฝึกฝน 😃

ขอบคุณสำหรับการอ่าน