BOM (Byte Order Mark)
Chuỗi byte ở đầu tệp xác định mã hóa. EF BB BF cho UTF-8, FF FE hoặc FE FF cho UTF-16.
BOM (Byte Order Mark) là chuỗi byte đặc biệt được đặt ở đầu tệp văn bản để chỉ thị loại mã hóa và thứ tự byte (endianness). Đây là dạng mã hóa của ký tự Unicode U+FEFF (ZERO WIDTH NO-BREAK SPACE), đóng vai trò gợi ý cho ứng dụng tự động phát hiện mã hóa của tệp. BOM không phải là một phần nội dung của tệp mà hoạt động như siêu dữ liệu.
Chuỗi byte cụ thể của BOM thay đổi theo mã hóa. UTF-8 sử dụng EF BB BF (3 byte), UTF-16 Big Endian sử dụng FE FF (2 byte), UTF-16 Little Endian sử dụng FF FE (2 byte), và UTF-32 BE sử dụng 00 00 FE FF (4 byte). Đối với UTF-16 và UTF-32, nơi các giá trị đa byte có thể được lưu trữ theo thứ tự byte khác nhau, BOM rất cần thiết để phát hiện endianness. Tuy nhiên, UTF-8 không có khái niệm thứ tự byte, vì vậy BOM của nó chỉ đóng vai trò nhận dạng mã hóa. Hướng dẫn mã hóa tệp bao gồm chi tiết về BOM.
Trong thực tế, các vấn đề thường gặp nhất liên quan đến BOM UTF-8. Chuỗi 3 byte (EF BB BF) ở đầu tệp bị nhiều chương trình và công cụ coi là dữ liệu không mong muốn. Ví dụ, BOM ở đầu script shell ngăn dòng shebang (#!/bin/bash) được nhận dạng, gây ra lỗi thực thi. Trong tệp PHP, BOM được gửi trước đầu ra HTML, kích hoạt lỗi headers already sent. Với tệp CSV, sự có mặt hay vắng mặt của BOM quyết định Excel hiển thị ký tự chính xác hay hiển thị văn bản lỗi. Trong phát triển web, UTF-8 không có BOM là tiêu chuẩn thực tế, và đặc tả HTML5 khuyến nghị bỏ qua BOM.
Windows Notepad trước đây thêm BOM mặc định khi lưu dưới dạng UTF-8, nhưng bắt đầu từ Windows 10 phiên bản 1903, UTF-8 không có BOM trở thành mặc định. Thay đổi này là cải tiến đáng hoan nghênh cho các nhà phát triển web và lập trình viên. Tuy nhiên, mở tệp CSV UTF-8 chính xác trong Excel vẫn có thể yêu cầu BOM, vì vậy lựa chọn phù hợp phụ thuộc vào trường hợp sử dụng. Các trình soạn thảo hiện đại như Visual Studio Code và Sublime Text cho phép bạn kiểm tra và thay đổi mã hóa và trạng thái BOM từ thanh trạng thái. Sách năng suất trình soạn thảo văn bản thảo luận về cài đặt mã hóa như một chủ đề quan trọng.
Trong đếm ký tự, BOM là cạm bẫy dễ bỏ sót. Vì BOM là ký tự vô hình có chiều rộng bằng không, nó không hiển thị trên màn hình, nhưng ảnh hưởng đến kích thước tệp - tệp UTF-8 có BOM lớn hơn 3 byte so với tệp không có. Ngoài ra, nếu BOM vẫn còn ở đầu chuỗi khi đọc nội dung tệp, nó có thể khiến số ký tự sai lệch một đơn vị hoặc so sánh chuỗi thất bại bất ngờ. Khi đọc tệp bằng lập trình, điều quan trọng là phát hiện và loại bỏ BOM một cách phù hợp.