【问题标题】:Writing UTF-8 friendly parsers in python在 python 中编写 UTF-8 友好的解析器
【发布时间】:2011-07-05 19:46:44
【问题描述】:

我写了一个简单的文件解析器和写入器,但后来我看到一篇谈论 unicode 重要性的文章,然后我突然想到我假设输入文件是 ascii 编码的,可能并非如此时间,虽然在我的情况下很少见。

在极少数情况下,我希望使用 UTF-8 编码的文件。

有没有办法通过简单地改变我的读写方式来处理 UTF-8 文件?我对字符串所做的只是存储它们,然后将它们写出来,所以我只需要确保我可以正确读取、存储和写入它们。

此外,我是否必须分别处理 ascii 和 UTF-8 文件并为每个文件编写不同的函数?除了 ascii 文件之外,我还没有处理过任何其他文件,并且只阅读了有关处理 unicode 的内容。

【问题讨论】:

  • ASCII 是 UTF-8 的子集,因此您不需要两组代码。

标签: python unicode-string python-2.7


【解决方案1】:

Python 本身就支持 Unicode。如果您直接从第一个文件读取和写入第二个文件,则不会丢失任何数据,因为它会逐字复制字节。但是,如果您对字符串进行解码然后重新编码,则需要确保使用正确的编码。

【讨论】:

    【解决方案2】:

    如果您使用的是 Python 2,您可以简单地将所有 str 对象更改为 unicode 对象。 Unicode 对象具有与字符串相同的所有方法,但以 unicode 格式而不是 ASCII 编码。见http://docs.python.org/library/functions.html#unicode

    如果您使用的是 Python 3,则字符串默认以 UTF-8 编码。

    【讨论】:

    • unicode 对象是 unicode 字符序列;它们不是以 UTF-8 或任何其他编码编码的。
    • @Wooble:从技术上讲,它们以Py_UNICODE 使用的任何编码进行编码,可能是 UCS-2 或 UCS-4(我相信),具体取决于实现。
    • 好的,为了准确起见,我将编辑我的帖子。但在答案的上下文中,这是一个相对较小的细节。
    • @Zhehao:这是一个巨大的细节,因为您需要将它们编码为某种编码以进行显示,这是造成混乱和错误消息的主要来源。
    • @Wooble - 不,我的意思是使用的确切编码在很大程度上无关紧要。显然字符串有一个编码。 unicode 对象以 unicode 编码的事实很重要。但是,在答案的上下文中,unicode 的确切类型并不那么重要。
    【解决方案3】:

    如果您使用的是 Python 2.6 或更高版本,则可以使用 io 库及其 io.open 方法打开所需的文件。它有一个encoding 参数,在你的情况下应该设置为'utf-8'。当您读取或写入返回的文件对象时,字符串会自动进行编码/解码。

    无论如何,您不需要为 ASCII 做一些特殊的事情,因为 UTF-8 是 ASCII 的超集。

    【讨论】:

      【解决方案4】:

      只要您只是读取和写入文件而不期待任何其他类型的编码输入,那么您就不必做任何特别的事情。

      % cat /tmp/u
      π is 3.14.
      
      % file /tmp/u
      /tmp/u: UTF-8 Unicode text
      
      % cat f.py
      f = open('/tmp/u', 'r')
      d = f.read()
      print d.split()
      f.close()
      
      % python f.py 
      ['\xcf\x80', 'is', '3.14.']
      

      当您使用 UTF-8 声明或接受标准输入时,这种情况会发生变化。

      % cat g.py
      s = 'π is 3.14.'
      print s.split()
      
      % python g.py
        File "g.py", line 1
      SyntaxError: Non-ASCII character '\xcf' in file g.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
      

      要正确处理此问题,请在每个 PEP 263 的开头声明 Python 程序的编码(由上面的 SyntaxError 异常引用)。

      % cat h.py
      # -*- coding: utf-8 -*-
      s = 'π is 3.14.'
      print s.split()
      
      % python h.py
      ['\xcf\x80', 'is', '3.14.']
      

      【讨论】:

        猜你喜欢
        • 2012-11-07
        • 1970-01-01
        • 2023-02-17
        • 2018-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        相关资源
        最近更新 更多