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

CRLF กับ LF: ทำไมการขึ้นบรรทัดใหม่ยังคงสร้างปัญหา

ผู้ให้บริการเว็บโฮสติ้งราคาประหยัดในไทยจำนวนมากยังใช้ cPanel บนเซิร์ฟเวอร์ Linux ขณะที่ผู้พัฒนาเว็บส่วนใหญ่ยังคงแก้ไขไฟล์บนเครื่อง Windows แล้วอัปโหลดผ่าน FTP — ถ้าโปรแกรม FTP ตั้งโหมด ASCII ผิด การขึ้นบรรทัดใหม่อาจถูกแปลงระหว่างทางแบบเงียบๆ จนสคริปต์ที่รันได้ปกติในเครื่องกลับพังบนเซิร์ฟเวอร์

ความแตกต่างนี้มาจากไหน

Unix และ macOS ใช้อักขระเดียว — LF (line feed, \n) Windows สืบทอดมาจากเครื่องเทเลไทป์รุ่นเก่าซึ่งใช้อักขระคู่ — CRLF (carriage return + line feed, \r\n): ตัวหนึ่งเลื่อน carriage กลับไปจุดเริ่มต้นของบรรทัด อีกตัวเลื่อนลงไปบรรทัดถัดไป — เป็นการเลียนแบบเครื่องพิมพ์ดีดตามตัวอักษร

ทำไมเรื่องนี้ยังสำคัญ

  • Git. หากไฟล์ที่มีการขึ้นบรรทัดแบบ CRLF เข้าไปในที่เก็บที่ไฟล์อื่นใช้ LF git อาจแสดงว่า "ไฟล์ทั้งหมดเปลี่ยนแปลง" แม้จะแก้เพียงบรรทัดเดียว — เพราะในทางเทคนิคการขึ้นบรรทัดของทุกบรรทัดเปลี่ยนไป
  • บรรทัด Shebang. สคริปต์ shell ของ Unix ที่บันทึกด้วยการขึ้นบรรทัดแบบ CRLF อาจรันไม่ได้บนเซิร์ฟเวอร์ เพราะ interpreter เห็นอักขระ \r เกินมาในบรรทัดแรก
  • การเปรียบเทียบสตริงในโค้ด. บรรทัดที่อ่านจากไฟล์ CRLF อาจไม่ตรงกันเมื่อเปรียบเทียบกับสตริง LF ที่คาดหวัง แม้ข้อความที่เห็นจะดูเหมือนกัน

วิธีจัดการเรื่องนี้

Git มีการตั้งค่า (core.autocrlf) ที่แปลงการขึ้นบรรทัดโดยอัตโนมัติเมื่อ checkout/commit แต่การพึ่งพาการตั้งค่าเฉพาะเครื่องของแต่ละคนนั้นไม่มั่นคง วิธีที่น่าเชื่อถือกว่าคือกำหนดรูปแบบไว้ในไฟล์ .gitattributes ที่ commit เข้าไปในที่เก็บ เพื่อให้กฎเดียวกันใช้กับทุกคนไม่ว่าจะใช้โปรแกรมแก้ไขหรือระบบปฏิบัติการใด

ทำไมต้องแปลงด้วยตนเอง

  • แก้ไขไฟล์ที่เข้าไปในที่เก็บด้วยรูปแบบการขึ้นบรรทัดที่ผิด
  • เตรียมสคริปต์สำหรับเซิร์ฟเวอร์ Linux ที่ถูกแก้ไขในโปรแกรมแก้ไขของ Windows ก่อนอัปโหลดผ่าน FTP
  • วินิจฉัยว่าทำไมการเปรียบเทียบข้อความระหว่างไฟล์สองไฟล์ที่ดูเหมือนกันจึงแสดงความแตกต่าง

รูปแบบผสมในไฟล์เดียว

ไฟล์ที่ถูกแก้ไขในโปรแกรมแก้ไขหลายตัวหรือหลายระบบปฏิบัติการอาจมีทั้ง CRLF และ LF ปนกัน — บางบรรทัดใช้รูปแบบหนึ่ง บางบรรทัดใช้อีกรูปแบบ นี่คือกรณีที่จัดการยากที่สุด: การแปลง "เป็น LF" อาจดูเหมือนไม่เปลี่ยนอะไรเลยสำหรับบรรทัดที่เป็น LF อยู่แล้ว แต่สิ่งสำคัญคือต้องใช้การแปลงกับทั้งไฟล์ ไม่ใช่แค่บรรทัดที่ดู "น่าสงสัย" มิฉะนั้นปัญหาจะยังคงซ่อนอยู่

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