Python读取字符时的UTF-8问题

8 投票
5 回答
11893 浏览
提问于 2025-04-15 12:12

我正在使用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)

撰写回答