簡體   English   中英

Pyparsing,Python 3和Unicode字節順序標記

[英]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中, unicodeunichr函數已經消失,因為所有字符串都是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM