我有一个UTF-8编码的文本文件,其中包含字节顺序标记 - 也就是说,前几个字节是EF BB BF 0D 0A 4D...
(它是VS 2013生成的Visual Studio解决方案文件)。
我正在尝试使用parseFile()
方法和Python 3来解析PyParsing。在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字节顺序标记?
答案 0 :(得分:2)
这里的问题似乎是使用parseFile()
方法读取文件时使用的默认编码是ASCII,因此UTF-8编码的字节顺序标记不会以{{结尾1}},最终为ASCII U+FEFF
。要解决此问题,您可以显式打开文件并指定编码。而不是:
EF BB BF
这样做:
p.parseFile('filename.sln')
然后可以使用以下解析器跳过字节顺序标记:
p.parseFile(open('filename.sln', encoding='utf-8'))
答案 1 :(得分:2)
使用utf_8_sig
编码类型打开文件:
p.parseFile(open('filename.sln', encoding='utf_8_sig'))
如果BOM存在,将被禁止。
来自编解码器模块:
在编码时,UTF-8编码的BOM将被添加到UTF-8编码的字节之前。对于有状态编码器,这只做一次(在第一次写入字节流时)。对于解码,将跳过数据开头的可选UTF-8编码BOM。