在python中编写UTF-8友好解析器

时间:2011-07-05 19:46:45

标签: python unicode-string python-2.7

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

在极少数情况下,我会期待UTF-8编码的文件。

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

此外,我是否必须单独处理ascii和UTF-8文件并为每个文件编写不同的函数?我还没有使用ascii文件以外的任何东西,只阅读有关处理unicode的信息。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

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

% 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.']