先前接受的答案是錯的。
u'\ufffe'
不是一個字符。如果你用unicode字符串得到它,那麼有人已經塞進了很多。
的BOM(又名ZERO WIDTH NO-BREAK SPACE)是u'\ufeff'
>>> UNICODE_BOM = u'\N{ZERO WIDTH NO-BREAK SPACE}'
>>> UNICODE_BOM
u'\ufeff'
>>>
讀this(按Ctrl-F搜索BOM)和this和this(按Ctrl-F搜索BOM)。
這裏有一個正確和錯字/耐braino回答:
解碼你的投入unicode_str
。那麼做到這一點:
# If I mistype the following, it's very likely to cause a SyntaxError.
UNICODE_BOM = u'\N{ZERO WIDTH NO-BREAK SPACE}'
if unicode_str and unicode_str[0] == UNICODE_BOM:
unicode_str = unicode_str[1:]
獎勵:使用命名常量讓讀者有更多的線索來是怎麼回事呢相比看似武斷hexoglyphics集合了一下。
更新不幸的是,標準Python庫似乎沒有合適的命名常量。
唉,編解碼器模塊提供唯一的「圈套和妄想」:
>>> import pprint, codecs
>>> pprint.pprint([(k, getattr(codecs, k)) for k in dir(codecs) if k.startswith('BOM')])
[('BOM', '\xff\xfe'), #### aarrgghh!! ####
('BOM32_BE', '\xfe\xff'),
('BOM32_LE', '\xff\xfe'),
('BOM64_BE', '\x00\x00\xfe\xff'),
('BOM64_LE', '\xff\xfe\x00\x00'),
('BOM_BE', '\xfe\xff'),
('BOM_LE', '\xff\xfe'),
('BOM_UTF16', '\xff\xfe'),
('BOM_UTF16_BE', '\xfe\xff'),
('BOM_UTF16_LE', '\xff\xfe'),
('BOM_UTF32', '\xff\xfe\x00\x00'),
('BOM_UTF32_BE', '\x00\x00\xfe\xff'),
('BOM_UTF32_LE', '\xff\xfe\x00\x00'),
('BOM_UTF8', '\xef\xbb\xbf')]
>>>
更新2如果您還沒有解碼你的輸入,並要檢查它的BOM,您需要爲UTF-16檢查TWO不同的物料清單,至少檢查UTF-32的不同物料清單,至少TWO。如果只有一種方法,那麼你不需要BOM,你會嗎?
這裏逐字從我自己的代碼unprettified是我解決這個:
def check_for_bom(s):
bom_info = (
('\xFF\xFE\x00\x00', 4, 'UTF-32LE'),
('\x00\x00\xFE\xFF', 4, 'UTF-32BE'),
('\xEF\xBB\xBF', 3, 'UTF-8'),
('\xFF\xFE', 2, 'UTF-16LE'),
('\xFE\xFF', 2, 'UTF-16BE'),
)
for sig, siglen, enc in bom_info:
if s.startswith(sig):
return enc, siglen
return None, 0
輸入s
應至少前4個字節的輸入。它返回可用於解碼輸入的BOM後部分的編碼,以及BOM(如果有)的長度。
如果你是偏執的人,你可以允許另外兩個(非標準的)UTF-32排序,但是Python不提供他們的編碼,我從來沒有聽說過實際發生,所以我不'麻煩了。
哦!非常好!我會盡快嘗試。 – Cameron 2010-03-17 12:03:39
精美地工作(儘管Chrome神祕地停止了提供錯誤,即使使用舊的(錯誤的)代碼也是如此 - 這就是我一次完成一大堆更改的結果)。 – Cameron 2010-03-18 00:34:10