尝试使用编解码器lib打开文件时出现Ascii错误

时间:2014-08-29 12:18:57

标签: python utf-8 ascii

代码

# -*- coding: ISO-8859-15 -*-
import sys
import codecs
filename2 = "log_unicode2.log"
log_file2 = codecs.open(filename2, "w", "utf-8")
sys.stdout = log_file2
log_file2.write('aééé')

错误

Traceback (most recent call last):
  File "snippet_problem_unicode.py", line 7, in <module>
    log_file2.write('a├®├®├®')
  File "C:\Users\dev1\Envs\atao\lib\codecs.py", line 691, in write
    return self.writer.write(data)
  File "C:\Users\dev1\Envs\atao\lib\codecs.py", line 351, in write
    data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal
not in range(128)

Contexte

  • Windows 7
  • Python 2.6
  • 的Eclipse

'aééé'是一个字节字符串(latin-1),需要转换为utf-8。 为什么这种转换涉及ascii编解码器?

1 个答案:

答案 0 :(得分:1)

您正在为期望 unicode的文件对象写字节字符串。要从字节字符串转到unicode值,Python必须解码字节字符串。此解码使用默认的ASCII编解码器。

或者:

  1. 使用unicode文字而不是字节字符串:

    log_file2.write(u'aééé')
    
  2. 首先使用源文件编码将字节串显式解码为Unicode:

    log_file2.write('aééé'.decode('latin1'))
    
  3. 不使用codecs.open(),而是使用内置的open()函数打开文件,然后手动解码,然后编码为UTF:

    log_file2 = open(filename2, "w")
    log_file2 .write('aééé'.decode('latin1').encode('utf8')
    

    或使用unicode字面值并手动编码:

    log_file2 = open(filename2, "w")
    log_file2 .write(u'aééé'.encode('utf8'))