2016-02-01 63 views
2

我有一個UTF-8編碼的文本文件,其中存在字節順序標記 - 也就是說,前幾個字節是EF BB BF 0D 0A 4D...(它是由VS產生的Visual Studio解決方案文件2013)。Pyparsing,Python 3和Unicode字節順序標記

我試圖用PyParsing解析這個,使用parseFile()方法和Python 3,在Python 2,我可以這樣做:

import pyparsing as pp 
bom = pp.Optional(unicode(unichr(0xfeff)).encode('utf-8')).suppress() 

得到一個可選的字節順序標記。但在Python 3中,unicodeunichr函數已經消失,因爲所有字符串都是Unicode。所以,我想這一點:

bom = pp.Optional(chr(0xfeff)).suppress() 

這:

bom = pp.Optional('\ufeff').suppress() 

但無論是文件的開頭匹配。我搜索了一段時間,但似乎無法找到任何相關的東西。

我該如何匹配(或者只是忽略!)Unicode字節順序標記?

+0

不是Visual Studio解決方案文件XML嗎? –

+0

恩,不是我正在看的那些。項目文件肯定是,但解決方案文件不是。 – Tom

回答

2

看來,這裏的問題是,讀取使用parseFile()方法是ASCII文件時,所以UTF-8編碼的字節順序標記不最終成爲U+FEFF使用的默認編碼,它作爲ASCII結束EF BB BF。要解決此問題,您可以顯式打開文件並指定編碼。取而代之的是:

p.parseFile('filename.sln') 

做到這一點:

p.parseFile(open('filename.sln', encoding='utf-8')) 

然後字節順序標記可以用下面的解析可以跳過:

bom = pp.Optional(chr(0xfeff)).suppress() 
+1

或者打開文件,使用'.read()'讀取內容,然後調用'parseString' - 'parseFile'只是'parseString'周圍的一個簡單的便利包裝。 – PaulMcG

1

打開使用utf_8_sig編碼類型的文件:

p.parseFile(open('filename.sln', encoding='utf_8_sig')) 

如果BOM存在,它將被抑制。

從編解碼器模塊:

在編碼UTF-8編碼的BOM將前置到UTF-8編碼的字節。對於有狀態編碼器,這隻會執行一次(在第一次寫入字節流時)。在數據開始時解碼可選的UTF-8編碼BOM將被跳過。