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

Ruby Strings แกะลึกลับ: Mastering ASCII & Unicode Encoding

String ของตัวอักษรอยู่ในโลก Computer ที่เข้าใจแค่ 0 และ 1 ได้ยังไง?

Well... เหมือน Map Domain Name ไป IP Address หรือ Barcode ไป Product — เรา Map Numbers ไป Characters!

เช่น 97 -> "a", 122 -> "z" — นั่นคือวิธีมี Characters ในโลก Numbers

แต Numbers ไหนไปกับ Characters ไหน? ตอบด้วย Character Mapping Systems ต่างๆ

เริ่มจาก ASCII — American Standard Code for Information Interchange

หา ASCII Table หรือถาม Ruby Convert Characters -> ASCII Values

แบบนี้:

 "a".ord # 97 

หลาย Characters:

 "abc".bytes # [97, 98, 99] 

Integer -> Character:

 97.chr # "a" 

ASCII Encoding รวม:

  • Control Characters (Newlines, Tabs, Null)
  • Symbols (Parenthesis, Equals, Question Marks)
  • Numbers (0-9)
  • Characters (a-z, A-Z)

Range จำกัด — ไม่รวมภาษาอื่น เช่น Chinese, Japanese

ASCII ใน Real World

Mapping Numbers-Strings เกิดขึ้นเบื้องหลัง — แตมี Practical Uses!

เช่น: HTTP Spec ไม่อนุญาตบาง Characters ใน URLs — แต Encode Invalid Characters ใน ASCII Format Web Servers สมัยใหม่ตีความได้

 example.com/a+++ => example.com/a%2B%2B%2B 

%2B คือ + ใน ASCII-Encoded Format — ยัง Transform Characters ได้

เช่น: ASCII Table Lowercase -> Uppercase ลบ 32

 ("a".ord - 32).chr # "A" 

กลับกันก็ได้: ("A".ord + 32).chr # "a" — Ruby มี upcase/downcase แตอาจช่วยใน Interview/Coding Challenge

Unicode คืออะไร?

ASCII Encode ได้ 127 Characters (256 Extended) — จำกัด Characters ที่แสดงได้

โซลูชัน? Unicode — String Encoding System รองรับถึง 1 ล้าน Characters — มากกว่า ASCII มาก!

รวมภาษาทุกชนิด Symbols ใหม่ Emojis ได้

Unicode ตัวอย่าง:

 ɑΩϕβΣπ 

อักษรกรีก ไม่แสดงได้ด้วย ASCII

วิธีใช้ Unicode ใน Ruby

Ruby Support Unicode Enabled By Default ตั้งแต่ Ruby 1.9

ทำได้:

 π = 3.141592 

หรือนี้:

 def ★★★
  puts "You get 3 stars, great job!"
end
★★★ # "You get 3 stars, great job!" 

สนุก! แต่น่าจะไม่ Practical Define Methods/Variables ด้วย Symbols เพราะไม่มีบน Keyboard

จริงๆ มี Valid Invisible Unicode Characters

ตัวอย่าง:

 def ​
  puts "Invisible method"
end
​ 

ดูเหมือน Method ไม่มีชื่อ (Normally Not Allowed) — แตทำงานได้เพราะ Invisible Unicode Char!

String Encoding Methods

Ruby มี Methods จัดการ Encoding Systems

เช่น: "abc".encoding.name # "UTF-8"

บางกรณี Current Encoding (encoding.name) ไม่ Match Actual Encoding ของ String — เจอตอนอ่าน Data จาก Website, File, DB, External Sources — Result: InvalidByteSequenceError

ต้องเปลี่ยน Encoding — ทำยังไง? 用 encode Method:

 "abcΣΣΣ".encode("ASCII", "UTF-8", undef: :replace) # "abc???" 

Convert UTF-8 (Unicode) -> ASCII — Σ ไม่มีใน ASCII บอก Ruby Replace — Default = Question Marks

เปลี่ยนได้: "abcΣΣΣ".encode("ASCII", "UTF-8", invalid: :replace, undef: :replace, replace: "") # "abc"

หรือ "Fallback" Option: "abcΣΣΣ".encode("ASCII", "UTF-8", fallback: {"Σ" => "E"}) # "abcEEE"

มันบอกว่า: "Replace UTF-8 -> ASCII ใช้ Fallback Hash แปล Characters ที่ไม่มีใน ASCII"

อีก Method force_encoding เปลี่ยน Encoding โดยไม่ Translate — "abc½½½".force_encoding("iso-8859-1")

List Encodings: Encoding.aliases

Summary (สรุป)

คุณเรียนรู้ Computer สร้าง Characters จาก Numbers ด้วย Encoding Tables! ASCII และ Unicode ใน Ruby

ตอนนี้เปิด Editor ฝึกเล่น 😃 — ขอบคุณที่อ่านครับ