Tôi đã gặp phải vấn đề tương tự như Edward. Tôi đồng ý với Dustin, thông thường một người sẽ không sử dụng các ký tự rỗng trong các tệp văn bản.
Tuy nhiên tôi đã tạo một tệp chứa tất cả các ký tự unicode. Trước tiên tôi đã sử dụng mã hóa utf-32le, sau đó mã hóa utf-32be, mã utf-16le và mã hóa utf-16be cũng như mã hóa utf-8.
Khi cố gắng mã hóa lại các tệp thành utf-8, tôi muốn so sánh kết quả với tệp utf-8 hiện có. Vì ký tự đầu tiên trong tệp của tôi sau BOM là ký tự rỗng, tôi không thể phát hiện thành công tệp với utf-16le BOM, nó hiển thị dưới dạng utf-32le BOM, vì các byte xuất hiện chính xác như Edward đã mô tả. Ký tự đầu tiên sau BOM FFFE là 0000, nhưng phát hiện BOM tìm thấy một FFFE0000 BOM và như vậy, phát hiện utf-32le thay vì utf-16le, theo đó ký tự 0000 đầu tiên của tôi đã bị đánh cắp và lấy làm một phần của BOM.
Vì vậy, người ta không bao giờ nên sử dụng ký tự null làm ký tự đầu tiên của tệp được mã hóa với utf-16 chút endian, vì nó sẽ làm cho utf-16le và utf-32le BOM mơ hồ.
Để giải quyết vấn đề của mình, tôi sẽ trao đổi ký tự đầu tiên và ký tự thứ hai. :-)
Ký tự rỗng có thể là một phần của giao thức bậc cao được mã hóa trong văn bản. Unicode không thực sự quan tâm đến những điểm mã được sử dụng trong văn bản và U + 0000 chỉ là hợp lệ như U + 0041. – Joey
Đọc một giao thức bậc cao hơn, lý thuyết này mâu thuẫn với thiết lập câu hỏi trong đó mã hóa phải được đoán. Nếu bạn đang đọc một giao thức, bạn không đoán mã hóa. – u0b34a0f6ae
Để đặt nó theo một cách khác, nó không * không thể * để có một U + 0000 ở đầu của một tập tin, nhưng nó * cực kỳ hiếm *. Nếu đây là một khả năng cho dữ liệu bạn đang đọc thì bạn không nên dựa vào một BOM để phát hiện định dạng. –