繁体   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