บทความทั้งหมด

ช่องว่างที่มองไม่เห็น: ทำไมการเปรียบเทียบข้อความที่ดูเหมือนกันจึงล้มเหลว

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

ทำไมสิ่งนี้ทำให้เกิดบั๊กแปลก ๆ

ตัวอย่างคลาสสิกที่สุดคือการเปรียบเทียบสตริงที่ให้ผล "ไม่เท่ากัน" อย่างไม่คาดคิด แม้ข้อความบนหน้าจอจะดูเหมือนกัน สาเหตุมักเป็นเพราะสตริงหนึ่งมีช่องว่างธรรมดาและอีกสตริงมี non-breaking space ที่คัดลอกมาจากเอกสาร Word หรือหน้าเว็บ ในทางสายตาไม่มีความแตกต่าง แต่สำหรับคอมพิวเตอร์มี

Trim

Trim ลบอักขระช่องว่างจากจุดเริ่มต้นและจุดสิ้นสุดของสตริง โดยเนื้อหาตรงกลางไม่เปลี่ยนแปลง นี่เป็นการดำเนินการมาตรฐานสำหรับทำความสะอาดข้อมูลที่ผู้ใช้กรอก — ช่องว่างส่วนเกินที่ไม่ตั้งใจที่จุดเริ่มต้นของฟิลด์ในฟอร์มไม่ควรส่งผลต่อการเปรียบเทียบหรือตรวจสอบค่า

การรวมช่องว่าง

การดำเนินการทั่วไปอีกอย่างคือการแทนที่อักขระช่องว่างที่ต่อเนื่องกันหลายตัวด้วยตัวเดียว มีประโยชน์สำหรับข้อความที่คัดลอกจากแหล่งที่มีการจัดรูปแบบ (เช่น PDF หรือตาราง) ซึ่งอาจมีช่องว่างคู่หรือแท็บที่ไม่ตั้งใจปรากฏขึ้นแทนช่องว่างเดียว

ทำไมต้องใช้สิ่งนี้

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

อักขระความกว้างศูนย์

นอกเหนือจากอักขระช่องว่างที่มองเห็นได้แล้ว ยังมีอักขระความกว้างศูนย์ (zero-width space, zero-width joiner) — อักขระเหล่านี้ไม่กินพื้นที่บนหน้าจอเลย แต่ยังคงอยู่ในข้อความในฐานะอักขระแยกต่างหาก อักขระแบบนี้บางครั้งติดมากับข้อความเมื่อคัดลอกจากบางเว็บไซต์หรือแอปแชท และอาจทำให้การเปรียบเทียบสตริงหรือการค้นหาพังโดยไม่รู้ตัว ทั้งที่มองไม่เห็นเลยแม้แต่ในโปรแกรมแก้ไขข้อความ

ลองใช้เครื่องมือ