1 คะแนน โดย GN⁺ 2025-09-29 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ผู้เขียนพยายามเรียง ไฟล์รูปภาพ ตามลำดับตัวอักษร แต่พบว่า ผลการเรียงของระบบปฏิบัติการและตัวจัดการไฟล์ไม่เหมือนกัน
  • ใน Linux ls จะเรียงได้ตามปกติ แต่ตัวจัดการไฟล์แบบ GUI ส่วนใหญ่ เช่น Windows, Google Drive, KDE Dolphin ใช้ “natural sort” ที่ตีความชื่อไฟล์ซึ่งมีตัวเลขแบบ ตามค่าตัวเลขจริง
  • จึงเกิดผลลัพธ์ที่ต่างจากการเรียงสตริงแบบดั้งเดิม เช่น file-10.txt มาอยู่ก่อน file-9.txt
  • สาเหตุที่แท้จริงคือโทรศัพท์สองเครื่องใช้รูปแบบการตั้งชื่อไฟล์ต่างกัน โดยเครื่องหนึ่ง ต่อมิลลิวินาทีไว้หลังวินาทีทันที แต่อีกเครื่อง คั่นด้วยขีดล่าง ทำให้เกณฑ์การเรียงต่างกัน
  • สุดท้าย วิธีแก้มีเพียง ทำรูปแบบชื่อไฟล์ให้เป็นมาตรฐานเดียวกัน หรือปรับค่าที่ซ่อนอยู่ของตัวจัดการไฟล์แต่ละตัว และผู้เขียนเสียดาย “ยุคที่คอมพิวเตอร์เดาความต้องการของผู้ใช้น้อยกว่าการทำตามคำสั่ง”

พื้นหลังและสถานการณ์ของปัญหา

  • ผู้เขียนไปเดินเขากับพ่อ และถ่ายรูปด้วยโทรศัพท์ Android ของแต่ละคน ก่อนจะนำรูปทั้งหมดมาเก็บไว้ในโฟลเดอร์เดียว
  • รูปแบบชื่อไฟล์ภาพคือ IMG_YYYYMMDD_HHmmss หรือมีตัวเลขเพิ่มเติมต่อท้ายก่อน .jpg
  • เพราะชื่อไฟล์นี้เรียงตามปี เดือน วัน และเวลาอยู่แล้ว จึงคิดว่าหากเรียงไฟล์ ตามตัวอักษร ก็จะได้ลำดับตามเวลาที่ถ่าย
  • แต่เมื่อใช้ Windows PC, Google Drive, KDE Dolphin ฯลฯ กลับพบว่า ไฟล์ที่ใช้รูปแบบเดียวกันไม่ได้เรียงต่อกันตามลำดับ
    • ตัวอย่าง: รูปที่พ่อถ่ายเวลา 5:54 กลับมาอยู่ก่อนรูปเวลา 9:20 และไปอยู่หลังรูปเวลา 12:11 เป็นต้น ทำให้ลำดับเพี้ยน
  • Gnome และตัวจัดการไฟล์อื่นบนสมาร์ตโฟนก็ให้ผลแบบเดียวกัน
  • ขณะที่คำสั่ง Linux ls กลับรักษาลำดับได้ถูกต้อง จึงยิ่งทำให้งง

การวิเคราะห์สาเหตุ

  • ตอนแรกผู้เขียนคิดว่าโทรศัพท์สักเครื่องอาจใช้ อักขระแปลกแทนขีดล่าง (_) แต่เมื่อตรวจด้วยคำสั่ง Linux ls ก็พบว่าเรียงได้ปกติ
  • บน Linux distribution หลายตัวและแม้แต่เซิร์ฟเวอร์ OpenBSD นั้น ls เรียงตามตัวอักษรได้ถูกต้อง
  • ตรงกันข้าม ตัวจัดการไฟล์แบบ GUI จำนวนมาก (Windows, Google Drive, KDE Dolphin ฯลฯ) จะเปรียบเทียบ ค่าตัวเลขจริง เมื่อชื่อไฟล์มีตัวเลข
    • กล่าวคือใช้ natural sorting แทนการเรียงตามตัวอักษร เป็นค่าเริ่มต้น
  • Natural sort จะเปรียบเทียบตัวเลขในสตริงตาม ค่าตัวเลข ไม่ใช่ตามค่าของตัวอักษรธรรมดา
    • ตัวอย่าง: file-9.txt < file-10.txt → เป็นลำดับที่คนส่วนใหญ่คาดหวัง
    • แต่การเรียงแบบดั้งเดิมจะมองว่า 1 < 9 จึงทำให้ file-10.txt มาก่อน
  • อย่างไรก็ตาม ตัวจัดการไฟล์สมัยนี้เมื่อเจอ “ส่วนที่เป็นตัวเลข” ก็มัก ตีความส่วนนั้นเป็นค่าตัวเลขจริงและบังคับให้ 9 มาก่อน 10
    • ซึ่งอาจไม่ตรงกับลำดับที่ผู้ตั้งชื่อไฟล์ตั้งใจไว้

สาเหตุจริงของปัญหาและวิธีแก้

  • โทรศัพท์ของพ่อใส่ตัวเลขมิลลิวินาทีต่อท้ายวินาทีทันที ส่วนโทรศัพท์ของผู้เขียน คั่นไว้ด้วยขีดล่าง
    • โทรศัพท์พ่อ: ต่อมิลลิวินาทีหลังวินาทีทันที → ตัวเลขก้อนนั้นใหญ่ขึ้นและถูกเลื่อนไปท้ายกว่า
    • โทรศัพท์ผู้เขียน: คั่นด้วยขีดล่าง → ถูกมองเป็นอีกสตริงหนึ่ง
  • วิธีแก้คือ จัดชื่อไฟล์ของฝั่งใดฝั่งหนึ่งใหม่ให้เป็นรูปแบบเดียวกันอย่างสม่ำเสมอ
  • ใน KDE Dolphin สามารถเลือกให้เรียงตามตัวอักษรล้วนได้จากตัวเลือกในโปรแกรม แต่การตั้งค่านี้ซ่อนอยู่จึงใช้งานลำบาก
  • และเนื่องจากแต่ละโปรแกรมรองรับไม่เหมือนกัน อาจต้องตั้งค่าแยกกันทุกครั้ง

บทสรุปของผู้เขียน

  • แม้จะสั่งให้เรียง “ตามตัวอักษร” แต่ผู้เขียนวิจารณ์ว่า ซอฟต์แวร์กลับเดาเจตนาของผู้ใช้แล้วใช้วิธีเรียงแบบอื่น
  • เขาคิดถึงวิธีการแบบในอดีต ที่ คอมพิวเตอร์ทำงานตามคำสั่งตรง ๆ อย่างเรียบง่าย

1 ความคิดเห็น

 
GN⁺ 2025-09-29
ความเห็นจาก Hacker News
  • คิดว่าวิธีการจัดเรียงที่ Microsoft, Google และ KDE เลือกใช้นั้นเข้าใจได้ง่ายกว่าและครอบคลุมกรณีใช้งานที่พบบ่อยกว่า โดยมองว่าสถานการณ์ของผู้เขียนเป็นกรณีที่พบได้น้อยมาก คนส่วนใหญ่มักอยากให้ “10” มาอยู่ถัดจาก “9” มากกว่า เดสก์ท็อปเอนวายรอนเมนต์ก็ระบุการจัดเรียงว่าเป็น “ตามชื่อ” ไม่ใช่ “ตามตัวอักษร” จึงไม่ได้ทำให้เข้าใจผิด แม้จะไม่ชอบที่คอมพิวเตอร์พยายามเดาเจตนา แต่เหมือนฟีเจอร์อย่างบันทึกอัตโนมัติ มันก็มีประโยชน์ในชีวิตจริง ถ้ามีตัวเลือกจัดเรียงตามตัวอักษรจริง ๆ ก็คงดี แต่ค่าเริ่มต้นควรเป็นแบบที่ตรงกับกรณีทั่วไปและใช้งานได้อย่างเป็นธรรมชาติ

    • ฉันเองก็ฉลาดพอจะเข้าใจดีว่าในลำดับตามตัวอักษร “10” จะมาก่อน “9” แต่ใน file manager ฉันอยากให้ “10” อยู่หลัง “9” ไม่อยากเติม 0 นำหน้าตัวเลขหลักเดียว และถ้าวันหลังต้องใช้เลขสามหลักก็ต้องมาเปลี่ยนชื่อใหม่อีกซึ่งยุ่งยาก ตอนแบ่งไฟล์หนังสือเสียงตามบทและต้องเผื่อไว้ว่าไม่ใช่ทุกเครื่องเล่นจะเรียงลำดับได้ถูกต้อง ฉันเลยใช้รูปแบบ “Chapter 01.mp3” หรือ “Chapter 001.mp3” ถึงขั้นเขียนสคริปต์อัตโนมัติไว้ด้วย แต่ก็ยังดูไม่สวยและเป็นงานที่ไม่จำเป็น ถ้าทุกอุปกรณ์เข้าใจตัวเลขได้ถูกต้องคงดีกว่ามาก
    • ฉันไม่เห็นด้วย ถ้ามีวิธีเดียวที่เป็นสากลและแน่นอนในการเขียนตัวเลขเป็นข้อความก็คงพอเข้าใจได้ แต่ในความเป็นจริงรูปแบบการป้อนตัวเลขมีความหลากหลายมาก ทำให้ฟีเจอร์ “เดาเจตนา” ทำงานได้เหมาะสมแค่บางกรณีเท่านั้น จุดทศนิยม ตัวคั่นหลักพัน สัญกรณ์วิทยาศาสตร์ ฯลฯ ล้วนเป็นกรณีพิเศษที่ซับซ้อน พอมองตามข้อกำหนดจริง ๆ ก็จะเห็นว่ามันแทบทำให้เชื่อถือได้ยาก
    • รู้สึกว่าคำกล่าวที่ว่าคนเราคุ้นเคยกับการเติม 0 ล่วงหน้าเป็นเรื่องธรรมชาติและปกตินั้นไม่ค่อยสมจริง เช่น ตอนเวอร์ชันเปลี่ยนจาก 5.9.17 เป็น 5.10.0 ก็ไม่มีใครกลับไปเปลี่ยนชื่อโฟลเดอร์เก่าให้เป็น 5.09.17 กันหมด ทุกวันนี้วิธีจัดเรียงมาตรฐานไม่ได้กำกวมและเข้าใจได้ง่าย ส่วนการเรียงตามตัวอักษรแบบเคร่งครัดนั้นไม่เหมาะกับส่วนติดต่อผู้ใช้
    • ปัญหาคือการเปลี่ยนแปลงแบบนี้ต่างจากการเรียงตามตัวอักษรแบบ “ทื่อ ๆ” ในอดีต จึงทำให้คนแปลกใจและสับสน ถ้าแยกวิธีแบบ “ฉลาด” ที่คนส่วนใหญ่ต้องการ ออกจาก “ตามตัวอักษรแบบเคร่งครัด” เป็นตัวเลือกคนละแบบน่าจะดีกว่า ถ้าทำให้เลือกได้อย่างตรงไปตรงมา แม้แต่ผู้ใช้ทั่วไปก็จะไม่รู้สึกสับสนกับประสบการณ์ใช้งาน
    • มีคนบอกว่ากรณีที่อยากให้ “10” มาก่อน “9” พบบ่อยกว่า แต่คงน่าจะหมายถึงตรงกันข้าม และขอเสริมว่าชื่อทางการของการเรียงแบบ “ตามชื่อ” คือ “Natural sort order”
  • หัวข้อนี้ทำให้นึกถึงข้อถกเถียงเรื่อง “Worse is better” วิธีจัดเรียงแบบง่ายตาม ANSI/Unicode ที่ผู้เขียนต้องการ จริง ๆ แล้วอาจเป็นฟีเจอร์ที่มีแต่นักพัฒนาเพียงส่วนน้อยเท่านั้นที่ต้องการ ในทางปฏิบัติผู้ใช้ GUI 99% อยากได้การจัดเรียงที่เป็นธรรมชาติมากกว่า การรู้ว่าใครคือผู้ใช้หลักส่งผลต่อการออกแบบผลิตภัณฑ์อย่างมาก ฟีเจอร์ที่ดีกว่าอาจเหมาะกับตัวผลิตภัณฑ์ แต่สำหรับระบบแล้ว ความเรียบง่ายอาจเหมาะกับการเติบโตและวิวัฒนาการมากกว่า

    • โมเดลในหัวของนักพัฒนาคือการจัดการชื่อที่มีตัวเลขปะปนแบบตรงไปตรงมาและ naïve ขณะที่ผู้ใช้ทั่วไปมองว่า 10 ควรอยู่หลัง 9 อย่างเป็นธรรมชาติ จะเอาวิธีคิดของนักพัฒนาไปยัดเยียดให้ทุกคนไม่ได้
    • อยากรู้ว่าคนที่บอกว่าควรใช้วิธีที่ “แย่กว่า” คิดอย่างไรกับการจัดเรียงตัวพิมพ์ใหญ่-เล็ก จะยึดตามลำดับ code point ของ ASCII/Unicode แบบตรง ๆ หรือจะ normalize ให้เป็นอักขระเดียวกันแล้วจัดกลุ่มตัวพิมพ์ใหญ่-เล็กเข้าด้วยกัน
    • การอ้าง “กลุ่มผู้ใช้เป้าหมาย” เพื่อไม่เพิ่มตัวเลือกนั้นฟังไม่ขึ้นเลย การรองรับทั้งสองแบบไม่ใช่เรื่องยาก ใส่ไว้ในโหมดขั้นสูงก็ยังดี ซอฟต์แวร์ที่ยอมรับความต้องการที่หลากหลายต่างหากคือโปรแกรมที่ดีกว่าจริง ๆ เหมือนหลัก 80/20 ที่ฟีเจอร์ซึ่งมีคนใช้น้อยก็ยังจำเป็น รู้สึกเหนื่อยกับสภาพที่แม้แต่ฟีเจอร์พื้นฐานก็มักถูกตัดทิ้งภายใต้ข้ออ้างเรื่องวิสัยทัศน์ผู้ใช้ที่สมบูรณ์แบบ
  • เวลาไปหาไฟล์ที่ตั้งชื่อเป็นค่าแฮช การจัดเรียงอัตโนมัตินี่แหละที่น่ารำคาญที่สุด บน Windows นี่เป็นหนึ่งในไม่กี่ตัวเลือกที่ฉันรีบปิดผ่าน registry เลย บ่อยครั้งก็คิดถึงยุคที่คอมพิวเตอร์ทำแค่ตามที่สั่ง ทุกวันนี้มันไม่ใช่แค่อ่านใจผู้ใช้ แต่เหมือนพยายามจะเปลี่ยนวิธีคิดของผู้ใช้ด้วย เลยไม่ชอบใจ และไม่พอใจกับทัศนคติแบบเผด็จการที่ว่า “ผู้ใช้ผิด” ไม่ว่าจะในซอฟต์แวร์โอเพนซอร์สด้วยหรือไม่ก็ตาม

    • ปัญหานี้ไม่ได้เกิดแค่กับแฮชธรรมดา แต่ยังสร้างความสับสนมากขึ้นกับ identifier หลายชนิดที่มีตัวเลขไร้ความหมายแทรกอยู่ตรงกลาง เวลาต้องหาไฟล์ที่มีเลขชุดใหญ่ ๆ อย่าง user ID หรือ Unix time ก็จะเจอว่า abcd89764237 กับ abcd683426834 ไปโผล่อยู่ในตำแหน่งที่ดูประหลาด ทำให้ต้องงมหาอยู่นานกว่าจะรู้สาเหตุ
  • ทุกคนชอบอ้างว่าตัวเองรู้ความต้องการของผู้ใช้ทั่วไป แต่ทำไมกลับไม่มีใครเสนอให้คอมพิวเตอร์เปลี่ยนชื่อไฟล์ให้เองตามใจเลย ถ้าจะไม่ยึดการเรียงแบบ ASCII ก็ไม่เห็นจำเป็นต้องยึดชื่อไฟล์ที่รวมส่วนขยายไว้ด้วย จริง ๆ แล้วผู้ใช้ไม่ได้สนใจนามสกุลอย่าง jpg หรือ png และก็ไม่ได้แยกแยะตัวพิมพ์ใหญ่-เล็กด้วย บนตระกูล Windows เองก็ใช้ส่วนขยายมานานเพราะเหตุผลด้านความเข้ากันได้เก่า ๆ เป็นหลัก น่าแปลกที่บังคับให้ใช้ “ชื่อไฟล์แบบคอมพิวเตอร์” แต่กลับยืนกรานจะทำลายแค่ “การจัดเรียงแบบคอมพิวเตอร์” ผู้ใช้ต้องการอะไรนั้นไม่มีใครรู้แน่ จึงไม่ควรฟันธง

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

    • ที่จริงมันไม่ได้อธิบายว่าเป็น “ตามตัวอักษร” ผู้เขียนต่างหากที่เข้าใจ “ตามชื่อ” ผิดว่าเป็น “ตามตัวอักษร”
    • พฤติกรรมที่อธิบายมานั้นมีประโยชน์ แต่สิ่งที่ถูกต้องคือควรบอกให้ผู้ใช้รู้ล่วงหน้าหรือให้เลือกตัวเลือกเอง
    • คำสั่ง sort ของ Linux ตอนนี้ก็รองรับการเรียงแบบเวอร์ชัน (sort -V) แล้ว แม้จะไม่รู้รายละเอียดภายใน แต่มันทำงานได้ดีในสถานการณ์ส่วนใหญ่ และที่สำคัญคือเปิดหรือปิดได้ง่ายมาก
    • วิธีการเรียงที่บทความพูดถึงคือ “lexical” แต่คนทั่วไปไม่ได้รู้ความต่างระหว่าง “lexical” กับ “alphabetic” โดยเฉลี่ย
  • สิ่งที่ถูกสั่งไม่ใช่ให้จัดเรียงไฟล์ “ตามตัวอักษร” แต่เป็น “ตามชื่อ” ดังนั้นการตีความจึงต่างกันได้ในแต่ละ OS คิดว่าส่วนใหญ่เลือกรูปแบบที่เหมาะกับผู้ใช้มากกว่าโดยอิงตามเหตุผลและข้อมูล อนาคตอาจเพิ่มกฎอย่างเช่นถ้ากลุ่มตัวเลขมี 0 นำหน้าก็ให้ใช้การเรียงตามตัวอักษรแบบเดิม หรืออาจมีตัวเลือกให้ผู้ใช้เลือกเอง

    • ถ้ามี 0 นำหน้าตัวเลขแล้วถือเป็นเลขฐาน 8 และใช้ได้เฉพาะเมื่อเลขถัดไปอยู่ในช่วง 0~7 ก็ดูเหมือนจะเข้าใจง่ายดี
    • แต่การตีความแบบนี้เปลี่ยนมาตั้งแต่ 10~20 ปีก่อนแล้ว เพราะในอดีต file manager แต่ละตัวนั้น “ตามชื่อ” ก็คือ “ตามตัวอักษร/ตามพจนานุกรม”
  • ใน macOS Foundation มี NSString.localizedStandardCompare() ให้ใช้อย่างเป็นทางการสำหรับการจัดเรียงใน Finder ส่วน Windows ก็มี StrCompareLogical นั่นคือแต่ละแพลตฟอร์มกำลังกำหนดเกณฑ์ของการเรียงตามชื่อ หรือก็คือ natural sort อย่างเป็นทางการ

    • น่าสนใจเพราะเดิมคิดว่ามันคงต่างจากคำสั่ง ls และตอนนี้ก็เริ่มคิดว่าวิธีนี้ดีกว่า แอปรูปภาพก็มักเรียงตาม timestamp อยู่แล้ว และถ้าจำเป็นต้องเรียงไฟล์ตามชื่อจริง ๆ ก็คงเลือกเรียงตามวันที่สร้างหรือไม่ก็ normalize ชื่อไฟล์เองไปเลย
  • รายงานของ Unicode พูดไว้อย่างชัดเจนว่าการจัดเรียงเปลี่ยนไปตามภาษาและบริบท เช่น ถ้าเรียง “A-10” แบบตัวอักษรโดยไม่ตีความตัวเลข “A-10” จะมาก่อน “A-2” แม้จะซับซ้อน แต่คิดว่านี่แหละคือเหตุผลที่ file browser เลือกใช้ natural sort

    • แต่ก็มีคนตั้งข้อสงสัยว่า -10 น้อยกว่า -2 อยู่แล้ว ดังนั้นลำดับไม่น่าจะสลับหรือเปล่า
  • การเรียงให้ “foo9” มาก่อน “foo10” นี่แหละคือ “natural sort” ไม่นานมานี้เพิ่งได้รู้วิธีทำ natural sort ด้วยโค้ด Python แค่ 2 บรรทัด แล้วพอใจมาก ขอแนะนำ โค้ดบน Stack Overflow ที่เกี่ยวข้อง

    • ในคำสั่ง sort(1) ก็รองรับ natural sort (-V) เหมือนกัน สร้างไฟล์รูปภาพขึ้นมาแล้วใช้ ls | sort -V ก็จะเรียงได้ถูกต้อง และผลลัพธ์ du -sh * ก็สามารถใช้ตัวเลือก sort -h เพื่อเรียงได้ด้วย
  • ไม่ได้โหยหาการเรียงแบบที่ทำให้ “Image-1.jpg, Image-11.jpg, Image-2.jpg” ปะปนกันเลย แม้จะเคยรู้สึกแปลกกับ natural sort อยู่บ้าง แต่พอ Windows เปลี่ยนมาเรียงตามค่าตัวเลขจริงก็สะดวกขึ้นมาก ไฟล์ถูกเรียงอย่างเป็นธรรมชาติและน่าพอใจมาก

    • แต่ก็มีความเห็นว่าบางคนอาจคาดหวังลำดับแบบนั้นอยู่แล้ว จึงขึ้นอยู่กับแต่ละคน