[英]Pyparsing, Python 3 and the Unicode byte order mark
我有一個UTF-8編碼的文本文件,其中包含字節順序標記 - 也就是說,前幾個字節是EF BB BF 0D 0A 4D...
(它是由VS 2013生成的Visual Studio解決方案文件)。
我試圖用PyParsing解析它,使用parseFile()
方法和Python 3.在Python 2中,我可以這樣做:
import pyparsing as pp
bom = pp.Optional(unicode(unichr(0xfeff)).encode('utf-8')).suppress()
獲取可選的字節順序標記。 但是在Python 3中, unicode
和unichr
函數已經消失,因為所有字符串都是Unicode。 所以我嘗試了這個:
bom = pp.Optional(chr(0xfeff)).suppress()
還有這個:
bom = pp.Optional('\ufeff').suppress()
但既不匹配文件的開頭。 我用谷歌搜索了一段時間,但似乎無法發現任何相關的東西。
如何匹配(或忽略!)Unicode字節順序標記?
這里的問題似乎是使用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()
使用utf_8_sig
編碼類型打開文件:
p.parseFile(open('filename.sln', encoding='utf_8_sig'))
如果存在,則將抑制BOM。
從編解碼器模塊:
在編碼時,UTF-8編碼的BOM將被添加到UTF-8編碼的字節之前。 對於有狀態編碼器,這只做一次(在第一次寫入字節流時)。 對於解碼,將跳過數據開頭的可選UTF-8編碼BOM。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.