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 ฝึกเล่น 😃 — ขอบคุณที่อ่านครับ