← กลับไปสารานุกรมตัวอักษร
ห้องทดลอง Unicode

เหตุใดข้อความ Zalgo จึงยืดขึ้นและลง?

ข้อความ Zalgo คืออักษรฐานธรรมดาที่ซ้อนเครื่องหมายประกอบจำนวนมาก เรียนรู้การจัดตำแหน่ง เหตุใด normalization จึงไม่ลบมัน และจุดที่เลย์เอาต์อาจพัง

กล้องจุลทรรศน์ตัวอักษร

แก้ไขตัวอย่างเพื่อดูโค้ดพอยต์ที่ประกอบเป็นสิ่งที่เห็นบนหน้าจอ

หลังตัวอักษรแต่ละตัวมีเครื่องหมายประกอบหลายตัว โดยปกติมันไม่เพิ่มความกว้างแนวนอน จึงซ้อนอยู่ที่ตำแหน่งเดียวกันได้

24 โค้ดพอยต์5 หน่วยที่มองเห็น
  1. U+005A
  2. U+0334
  3. U+0321
  4. U+031B
  5. U+032B
  6. U+0339
  7. U+033F
  8. U+0061
  9. U+0335
  10. U+0321
  11. U+0333
  12. U+030B
  13. U+006C
  14. U+0334
  15. U+0319
  16. U+0313
  17. U+0067
  18. U+0336
  19. U+0324
  20. U+0308
  21. U+006F
  22. U+0337
  23. U+031C
  24. U+033D

ข้อความ Zalgo ดูเหมือนฟอนต์หลุดออกจากกรอบบรรทัด

Z̴̡̛̫̹̿a̵̡̳̋l̴̙̓g̶̤̈o̷̜̽

มันไม่ใช่ภาพ และโดยทั่วไปไม่ใช่ฟอนต์เสีย เอฟเฟกต์เกิดจากการวาง เครื่องหมายประกอบ จำนวนมากหลังอักขระฐานธรรมดา

หน้าที่เดิมของเครื่องหมายประกอบ

ระบบการเขียนทั่วโลกต้องใช้เครื่องหมายเสียง สระ วรรณยุกต์ และสัญลักษณ์อื่นที่สัมพันธ์กับอักขระข้างเคียง Unicode เข้ารหัสหลายชนิดเป็นเครื่องหมายประกอบที่ไม่กินระยะ

แทนได้สองแบบ

  • อักขระสำเร็จรูป U+00E9 LATIN SMALL LETTER E WITH ACUTE
  • U+0065 LATIN SMALL LETTER E ตามด้วย U+0301 COMBINING ACUTE ACCENT

โค้ดพอยต์ตัวที่สองปรับตัวแรก ระบบวางเครื่องหมายเหนืออักษรฐานโดยไม่เลื่อนเคอร์เซอร์ไปหนึ่งความกว้างปกติ

เครื่องมือ Zalgo ใช้กลไกเดียวกัน แต่เพิ่มเครื่องหมายเหนือ ใต้ และกลางตัวอักษรมากกว่าที่การสะกดปกติต้องการ

เหตุใดจึงซ้อนได้รุนแรง

อักขระประกอบมี canonical combining class ช่วยกำหนดลำดับรอบอักษรฐาน ฟอนต์มีจุดยึดสำหรับชุดที่พบทั่วไป เมื่อเจอลำดับแปลกหรือยาวมาก ระบบเรนเดอร์ต้องจัดวางเท่าที่ทำได้

ฟอนต์หนึ่งอาจซ้อนอย่างเรียบร้อย อีกฟอนต์อาจปล่อยให้ชนกัน ทับบรรทัดข้างเคียง หรือยื่นออกจากปุ่ม ลำดับข้อความยังถูกต้อง แต่ส่วนติดต่อไม่ได้ออกแบบมารองรับเครื่องหมายหลายสิบตัวบนอักษรเดียว

นี่จึงเป็นเหตุผลที่เบราว์เซอร์และระบบปฏิบัติการแสดงต่างกัน Unicode กำหนดอักขระและคุณสมบัติ ส่วนฟอนต์กำหนดรูปและตำแหน่ง

Normalization ไม่ได้แปลว่า “ลบเครื่องหมาย”

Unicode normalization ช่วยเปรียบเทียบลำดับที่เทียบเท่ากัน NFC อาจรวมฐานกับเครื่องหมายเมื่อมีอักขระสำเร็จรูป ส่วน NFD แยกอักขระสำเร็จรูปออก ทั้งสองยังเรียงเครื่องหมายตามลำดับมาตรฐาน

แต่มันไม่ใช่เครื่องมือล้าง Zalgo ชุดสุดขั้วส่วนใหญ่ไม่มีอักขระสำเร็จรูป เครื่องหมายจึงยังอยู่หลัง normalization

หากผลิตภัณฑ์ต้องการตัวเลือก “ข้อความธรรมดา” ต้องตัดสินแยกว่าส่วนใดเป็นภาษาและส่วนใดเป็นการตกแต่ง การลบเครื่องหมายทั้งหมดจะทำลายภาษาเวียดนาม อาหรับ ฮีบรู อักษรอินเดีย และภาษาอื่นอีกมาก

หนึ่งตัวที่เห็นอาจมีหลายโค้ดพอยต์

กฎแบ่งข้อความของ Unicode จัดฐานและเครื่องหมายที่ตามมาไว้ในกลุ่มกราฟีมขยายเดียว เคอร์เซอร์จึงเดินผ่าน เป็นหนึ่งหน่วยได้แม้มีสองโค้ดพอยต์

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

ความยาวที่คนเห็นไม่เท่ากับความยาวที่คอมพิวเตอร์เก็บ

การตกแต่งบนโครงสร้างภาษาที่จำเป็น

เครื่องหมายประกอบไม่ใช่ “อักขระไม่ดี” แต่จำเป็นต่อการเขียนดิจิทัล เอฟเฟกต์นี้เกิดได้เพราะ Unicode รองรับระบบอักษรซับซ้อน

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

ใช้อย่างไรไม่ให้หน้าพัง

  • ใช้กับหัวข้อสั้นหรือคำเดียว
  • เลือกความเข้มต่ำถึงกลาง
  • ตรวจในแอปปลายทาง
  • ใส่ข้อความปกติด้วยเมื่อเนื้อหาสำคัญ
  • หลีกเลี่ยงชื่อบัญชี ลิงก์ อีเมล และข้อมูลความปลอดภัย

Zalgo คือการออกแบบตัวอักษรด้วยการสะสม อักษรฐานยังธรรมดา แต่เครื่องหมาย Unicode จริงสร้างรูปร่างที่ไม่ธรรมดา

เครื่องมือสร้างข้อความกลิทช์ให้ปรับจำนวนเครื่องหมายได้ เริ่มเบา ๆ แล้วตรวจผลในกล้องจุลทรรศน์

แหล่งข้อมูลและอ่านเพิ่มเติม

  1. มาตรฐาน
  2. มาตรฐาน
  3. มาตรฐาน
  4. บทความวิจัย
    Bad Characters: Imperceptible NLP Attacks

    Nicholas Boucher, Ilia Shumailov, Ross Anderson, and Nicolas Papernot 2022 IEEE Symposium on Security and Privacy 2022 DOI 10.1109/SP46214.2022.9833641

ความคิดเห็น

กำลังโหลดความคิดเห็น…