Ký tự Unicode U+FEFF
là dấu thứ tự byte hoặc BOM và được sử dụng để cho biết sự khác biệt giữa mã hóa UTF-16 lớn và nhỏ. Nếu bạn giải mã trang web bằng codec thích hợp, Python sẽ xóa nó cho bạn. Ví dụ:
#!python2
#coding: utf8
u = u'ABC'
e8 = u.encode('utf-8') # encode without BOM
e8s = u.encode('utf-8-sig') # encode with BOM
e16 = u.encode('utf-16') # encode with BOM
e16le = u.encode('utf-16le') # encode without BOM
e16be = u.encode('utf-16be') # encode without BOM
print 'utf-8 %r' % e8
print 'utf-8-sig %r' % e8s
print 'utf-16 %r' % e16
print 'utf-16le %r' % e16le
print 'utf-16be %r' % e16be
print
print 'utf-8 w/ BOM decoded with utf-8 %r' % e8s.decode('utf-8')
print 'utf-8 w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig')
print 'utf-16 w/ BOM decoded with utf-16 %r' % e16.decode('utf-16')
print 'utf-16 w/ BOM decoded with utf-16le %r' % e16.decode('utf-16le')
Lưu ý rằng EF BB BF
là một bảng mã UTF-8. Nó không cần thiết cho UTF-8, nhưng chỉ phục vụ như một chữ ký (thường là trên Windows).
Output:
utf-8 'ABC'
utf-8-sig '\xef\xbb\xbfABC'
utf-16 '\xff\xfeA\x00B\x00C\x00' # Adds BOM and encodes using native processor endian-ness.
utf-16le 'A\x00B\x00C\x00'
utf-16be '\x00A\x00B\x00C'
utf-8 w/ BOM decoded with utf-8 u'\ufeffABC' # doesn't remove BOM if present.
utf-8 w/ BOM decoded with utf-8-sig u'ABC' # removes BOM if present.
utf-16 w/ BOM decoded with utf-16 u'ABC' # *requires* BOM to be present.
utf-16 w/ BOM decoded with utf-16le u'\ufeffABC' # doesn't remove BOM if present.
Lưu ý rằng utf-16
mã đòi hỏi BOM có mặt, hoặc Python sẽ không biết nếu dữ liệu là big- hoặc về cuối nhỏ.
Nguồn
2013-07-28 20:56:17
Đầu vào này đến từ đâu? Bạn đang cố gắng làm gì? Vui lòng bao gồm mã Python của bạn. –
Ngẫu nhiên, tôi thấy rằng .replace() không hoạt động trong python hiện đại nếu tôi nhớ chỉ báo unicode: s.replace (u '\ ufeff', '') –
@DougBradshaw khi bạn nói "python hiện đại", ý bạn là , 2.7+ hoặc 3.0+? – teewuane