Newline Code

Ký tự điều khiển biểu diễn ngắt dòng. Ba loại tồn tại: LF (Unix), CR (Mac cũ) và CRLF (Windows).

Mã xuống dòng là ký tự điều khiển đánh dấu kết thúc một dòng và bắt đầu dòng tiếp theo trong dữ liệu văn bản. Ba loại chính là LF (Line Feed, U+000A), CR (Carriage Return, U+000D) và CRLF (tổ hợp hai ký tự CR theo sau là LF). Các tên này bắt nguồn từ cơ chế máy đánh chữ: CR di chuyển đầu in về đầu dòng, trong khi LF đẩy giấy lên một dòng. Khái niệm này được chuyển trực tiếp từ những ngày đầu của máy tính và tồn tại đến ngày nay.

Các hệ điều hành khác nhau sử dụng mã xuống dòng tiêu chuẩn khác nhau. Unix/Linux/macOS sử dụng LF, Windows sử dụng CRLF và Mac OS cổ điển (Mac OS 9 trở về trước) sử dụng CR. Sự khác biệt này ảnh hưởng trực tiếp đến tương thích tệp và có thể gây ra vấn đề khi trao đổi tệp văn bản giữa các hệ điều hành khác nhau. Trong Git, cài đặt core.autocrlf kiểm soát chuyển đổi xuống dòng tự động, và trong phát triển nhóm, việc thống nhất chính sách xuống dòng của kho lưu trữ bằng tệp .gitattributes là thực hành phổ biến. Bạn có thể tham khảo sách hướng dẫn Git thực hành về quản lý mã xuống dòng.

Trong lập trình, sự khác biệt mã xuống dòng là nguồn lỗi thường gặp. Nếu mã đọc tệp chỉ mong đợi LF, xử lý tệp CRLF sẽ để lại CR thừa ở cuối mỗi dòng. Biểu thức chính quy khớp cuối dòng với $ cũng có thể hoạt động không mong đợi do sự khác biệt mã xuống dòng. Xử lý văn bản mạnh mẽ đòi hỏi xử lý \r\n, \n\r một cách thống nhất.

Mã xuống dòng cũng được quy định trong nhiều giao thức và tiêu chuẩn. Giao thức HTTP sử dụng CRLF để phân tách tiêu đề, đặc tả CSV (RFC 4180) chuẩn hóa CRLF, và SMTP (giao thức email) yêu cầu CRLF cho ngắt dòng nội dung thư. Ngược lại, đặc tả JSON biểu diễn xuống dòng trong chuỗi là \n (LF đã escape).

Một quan niệm sai lầm phổ biến là mã xuống dòng vô hình nên có thể thay thế cho nhau, nhưng thực tế chúng khác nhau về số byte. LF là 1 byte trong khi CRLF là 2 byte, vì vậy đối với tập dữ liệu văn bản lớn, việc chọn mã xuống dòng ảnh hưởng đến kích thước tệp. Nhiều trình soạn thảo và công cụ bao gồm tính năng phát hiện và sửa mã xuống dòng hỗn hợp (khi cả LF và CRLF xuất hiện trong cùng một tệp). Bạn có thể tham khảo sách nền tảng lập trình về cơ bản xử lý văn bản.

Từ góc độ đếm ký tự, việc mã xuống dòng có được tính vào số đếm hay không ảnh hưởng đến kết quả. Hầu hết công cụ đếm ký tự đếm xuống dòng là một ký tự, nhưng CRLF được đếm là một hay hai ký tự thì khác nhau tùy công cụ. Để có số đếm ký tự chính xác, điều quan trọng là hiểu cách công cụ của bạn xử lý mã xuống dòng.