2016-02-01 35 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将被跳过。