【问题标题】:Unicode decode error using codecs.open()使用 codecs.open() 的 Unicode 解码错误
【发布时间】:2012-08-21 22:27:29
【问题描述】:

我遇到了如下字符编码问题:

rating = 'Barntillåten'
new_file = codecs.open(os.path.join(folder, "metadata.xml"), 'w', 'utf-8')
new_file.write(

"""<?xml version="1.0" encoding="UTF-8"?>
   <ratings>
        <rating system="%s">%s</rating>
   </ratings>""" % (values['rating_system'], rating))

我得到的错误是:

  File "./assetshare.py", line 314, in write_file
    </ratings>""" % (values['rating_system'], rating))

我知道编码错误与Barntillåten有关,因为如果我用test替换那个词,函数就可以正常工作。

为什么会发生这种编码错误,我需要做些什么来修复它?

【问题讨论】:

    标签: python encoding utf-8 character-encoding


    【解决方案1】:

    rating 必须是 Unicode 字符串才能包含 Unicode 代码点。

    rating = u'Barntillåten'
    

    否则,在 Python 2 中,非 Unicode 字符串 'Barntillåten' 包含字节(使用您的 source encoding 进行编码),而不是代码点。

    【讨论】:

      【解决方案2】:

      在 Python 2 中,codecs.open 期望读取和写入 unicode 对象。您将其传递给 str

      修复方法是确保你传递给它的数据是unicode

      new_file.write((
      
      """<?xml version="1.0" encoding="UTF-8"?>
      """<ratings>
              <rating system="%s">%s</rating>
         </ratings>""" % (values['rating_system'], rating)
      ).decode('utf-8'))
      

      如果您使用 unicode 文字 (u"..."),那么 Python 将尝试确保所有数据都是 unicode。这里有rating = u'Barntillåten'就足够了:

      rating = u'Barntillåten'
      new_file = codecs.open(os.path.join(folder, "metadata.xml"), 'w', 'utf-8')
      new_file.write(
      
      """<?xml version="1.0" encoding="UTF-8"?>
      """<ratings>
              <rating system="%s">%s</rating>
         </ratings>""" % (values['rating_system'], rating))
      

      您可以将str 对象写入codecs.open 文件,但前提是str 以默认编码进行编码,这意味着为了安全起见,只有str 是纯ASCII 时才是安全的。默认编码是并且应该保留为 ASCII;见Changing default encoding of Python?

      【讨论】:

      • .decode('utf-8') 假定 values['rating_system']rating 是表示 utf-8 编码文本的字节。在这种情况下,它要求源代码字符编码为 utf-8。所以最好先使用 Unicode 字面量而不用 .decode() 以后
      【解决方案3】:

      你需要使用unicode 字面量。

      u'...'
      u"..."
      u'''......'''
      u"""......"""
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 2016-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多