【问题标题】:Pyparsing, Python 3 and the Unicode byte order markPyparsing、Python 3 和 Unicode 字节顺序标记
【发布时间】:2016-05-10 02:56:26
【问题描述】:

我有一个 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 字节顺序标记?

【问题讨论】:

  • Visual Studio 解决方案文件不是 XML 吗?
  • 嗯,不是我正在看的那些。项目文件肯定是,但解决方案文件不是。

标签: python python-3.x unicode pyparsing python-unicode


【解决方案1】:

使用utf_8_sig编码类型打开文件:

p.parseFile(open('filename.sln', encoding='utf_8_sig'))

如果 BOM 存在,它将被隐藏。

来自编解码器模块:

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

【讨论】:

    【解决方案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()
    

    【讨论】:

    • 或打开文件,使用.read() 读取内容,然后调用parseString - parseFile 只是parseString 周围的最小便利包装。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2015-07-07
    • 2010-09-17
    • 2011-07-13
    • 2010-11-05
    • 2010-11-05
    • 1970-01-01
    相关资源
    最近更新 更多