Vì một lý do nào đó, Python có vẻ đang gặp sự cố với BOM khi đọc chuỗi unicode từ tệp UTF-8. Hãy xem xét những điều sau:Tại sao chuỗi unicode Python yêu cầu xử lý đặc biệt cho UTF-8 BOM?
with open('test.py') as f:
for line in f:
print unicode(line, 'utf-8')
Có vẻ đơn giản, phải không?
Đó là những gì tôi nghĩ đến khi tôi chạy nó từ dòng lệnh và nhận được:
UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to
<undefined>
Một thăm viếng ngắn gọn để Google tiết lộ rằng BOM phải được xóa bằng tay:
import codecs
with open('test.py') as f:
for line in f:
print unicode(line.replace(codecs.BOM_UTF8, ''), 'utf-8')
Cái này chạy tốt. Tuy nhiên tôi đang đấu tranh để xem bất kỳ công đức trong này.
Có lý do nào đằng sau hành vi được mô tả ở trên không? Ngược lại, UTF-16 hoạt động liền mạch.
Nó không thể mã hóa nó vì U + FEFF là một noncharacter không hợp lệ. Đó là vì các tệp UTF-8 * không được cho phép * chứa BOM trong đó! Chúng không bắt buộc và cũng không được khuyến cáo. Endianness không có ý nghĩa với các đơn vị mã 8-bit. Chúng cũng vặn vẹo mọi thứ, bởi vì bạn không còn có thể làm 'cat a b c> abc' nếu những tập tin đó không liên quan (đọc: * bất kỳ *) BOM trong chúng. Dòng UTF-8 không được chứa BOM. Nếu bạn cần phải xác định nội dung của tập tin, bạn có nghĩa vụ phải sử dụng một prototocl cấp cao hơn. Đây chỉ là một lỗi Windows. – tchrist
@tchrist - Bạn biết đấy, lời giải thích này kết hợp với lời đề nghị của Josh Lee sẽ trở thành một câu trả lời hoàn hảo. – Saul
Ok, đã thêm.Hy vọng rằng công trình. – tchrist