Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pyparsing、Python 3和Unicode字节顺序标记_Python_Python 3.x_Unicode_Pyparsing_Python Unicode - Fatal编程技术网

Pyparsing、Python 3和Unicode字节顺序标记

Pyparsing、Python 3和Unicode字节顺序标记,python,python-3.x,unicode,pyparsing,python-unicode,Python,Python 3.x,Unicode,Pyparsing,Python Unicode,我有一个文本文件,它是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()

我有一个文本文件,它是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()
获取可选的字节顺序标记。但是在Python3中,
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\u 8\u sig
编码类型打开文件:

p.parseFile(open('filename.sln', encoding='utf_8_sig'))
如果BOM表存在,则该BOM表将被抑制

从编解码器模块:

在编码时,UTF-8编码的BOM将前置到UTF-8编码的字节。对于有状态编码器,这只执行一次(在第一次写入字节流时)。对于解码,将跳过数据开头的可选UTF-8编码BOM


visual studio解决方案文件不是XML吗?嗯,不是我现在看到的那些。项目文件肯定是,但解决方案文件不是。或者打开文件,使用
.read()
读取内容,然后调用
parseString
-
parseFile
只是
parseString
的最小方便包装。