Python读取字符时的UTF-8问题
我正在使用Python 2.5。这里发生了什么?我理解错了什么?我该怎么解决这个问题?
输入文件(in.txt):
Stäckövérfløw
代码文件(code.py):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print """Content-Type: text/plain; charset="UTF-8"\n"""
f = open('in.txt','r')
for line in f:
print line
for i in line:
print i,
f.close()
输出结果:
Stäckövérfløw
S t � � c k � � v � � r f l � � w
5 个回答
1
print c,
sys.stdout.write(i)
这个内容是说,它会添加一个“空字符”,并把正确的utf-8序列搞成错误的序列。所以,除非你只写一个字节到输出,否则这样是行不通的。
2
用codecs.open来代替,它对我有效。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print """Content-Type: text/plain; charset="UTF-8"\n"""
f = codecs.open('in','r','utf8')
for line in f:
print line
for i in line:
print i,
f.close()
14
for i in line:
print i,
当你读取文件时,读取到的内容其实是一串字节。这个for循环一次只处理一个字节。这在处理UTF-8编码的字符串时会出现问题,因为一些非ASCII字符是由多个字节组成的。如果你想使用Unicode对象,也就是以字符为基本单位来处理内容,你应该使用
import codecs
f = codecs.open('in', 'r', 'utf8')
如果sys.stdout
还没有设置合适的编码,你可能需要对它进行包装:
sys.stdout = codecs.getwriter('utf8')(sys.stdout)