2014-04-11 47 views
0

我無法切片UTF-8編碼文件。在使用編解碼器打開之後,由於開始時會導致移位的字節順序標記(BOM)字符,因此對部分進行切片變得困難。如何有效切片UTF-8編碼文件

查看下面我的嘗試的詳細信息。

def readfiles(filepaf): 
    with codecs.open(filepaf,'r', 'utf-8') as f: 
     g=f.read() 
     q=' '.join(g.split()) 
     return q 

q=readfiles(c:xxx) 

q=Katharine opened her lips and drew in her breath, as if to reply with equal vigor, when the shutting of a door... 

>>> q[0:100] 
u'\ufeffKatharine opened her lips and drew in her breath, as if to reply with equal vigor, when the shuttin' 


>>> q[0:100].encode('utf-8') 
'\xef\xbb\xbfKatharine opened her lips and drew in her breath, as if to reply with equal vigor, when the shuttin' 

唯一準確的結果來通過直接印刷切片部分,但我的程序使用切片部分的,而不是印刷,最經常的切片部分是不準確的,由於在開始換檔。

理想輸出

凱瑟琳打開她的嘴脣,她深吸了一口氣,彷彿用同樣的力度來回答,當shuttin

上怎麼給任何建議,但不會在一開始有BOM字符?

+1

備註:「開始時不需要的字符」的合適名稱是[BOM](http://en.wikipedia.org/wiki/Byte_order_mark) –

回答

1

丟棄從該片段開頭的第10位開始的字節,直到找到一個不是的字節爲止。那一個會開始一個新角色。您必須跳過至多3個字節。

或者,你可以切片的Unicode字符串,這不會給你破碎的字符。

請注意,\ ufeff是一個有效的字符:它是零寬度的非破壞性空間,一些破損的文本編輯器插入到UTF8文件的開頭以標識它們。如果你想跳過它,使用utf-8-sig編碼。

+0

我之前沒有這樣做過,一個簡單的例子會有所幫助。 – Tiger1

+0

我嘗試跳過,但它不工作。這是我做了'q [0:100] .decode('utf-8-sig')'。得到以下錯誤**消息:UnicodeEncodeError:'ascii'編解碼器無法編碼字符u'\ ufeff'在位置0:序號不在範圍內(128)** – Tiger1

+0

@Jone,我也試過這樣: '再版(q [0:100])。進行解碼( 'UTF-8-SIG')'。我得到了:'你'''''ufeffKatharine睜開她的嘴脣,吸了口氣,好像在shuttin'時以同樣的動力回覆.BIOS仍然存在。 – Tiger1