【问题标题】:UnicodeEncodeError when trying to convert Django models to XML尝试将 Django 模型转换为 XML 时出现 UnicodeEncodeError
【发布时间】:2011-01-27 13:37:42
【问题描述】:

我找到了一个 python 程序:Export Django database to xml file,它将 django 模型转换为 xml 表示。尝试运行程序时出现这些错误。我的模型包含一些用法语编写的文本。

Traceback (most recent call last):
  File "xml_export.py", line 71, in <module>
  writer.content(value)
File "xml_export.py", line 41, in content
  self.output += str(text)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 3:
ordinal not in range(128) 

【问题讨论】:

    标签: python xml django encoding django-models


    【解决方案1】:

    看起来您的变量 text 包含一个非 ASCII 字符串。

    见:

    >>> mystring = u"élève"
    >>> mystring
    u'\xe9l\xe8ve'
    >>> str(mystring)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 0: ordinal not in range(128)
    

    所以,你首先需要将你的字符串编码成UTF-8

    >>> str(mystring.encode("utf-8"))
    '\xc3\xa9l\xc3\xa8ve'
    

    或者,如果(如 cmets 所示)text 可能包含字符串以外的其他变量类型,请使用

    self.output += unicode(mystring).encode("utf-8")
    

    【讨论】:

    • 如果我这样做,我会得到: Traceback(最近一次调用最后):文件“xml_export.py”,第 71 行,在 writer.content(value) 文件“xml_export.py”中,第 41 行,在内容中 self.output += str(text.encode("utf-8")) AttributeError: 'int' object has no attribute 'encode'
    • 这很奇怪。这意味着text 包含一个整数变量。这反过来又让人很难弄清楚为什么在text 中会有一个é,除非该变量一直在改变它的类型(这在Python 中是合法的),但这会使这种情况变得更加困难。您需要提供更多信息 - text 来自哪里?你用它做什么?
    • 文本数据来自数据库的字段,所以字段的值也可以包含数字。
    • 我试过 unicode(文本)。这解决了内容方法中的问题,但随后我在 fp.write(self.output) 行的保存方法中出现了另一个错误。我得到的错误是: Traceback(最近一次调用最后一次):文件“xml_export.py”,第 77 行,在 writer.save(“export.xml”)文件“xml_export.py”,第 48 行,在保存 fp.write(self.output) UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 404 : ordinal not in range(128)
    【解决方案2】:

    说真的,不要使用链接代码。这很糟糕,而且似乎是由完全不了解 unicode、字符编码甚至如何构建 XML 文档的人编写的。字符串连接?真的吗?

    只是不要使用它。

    【讨论】:

      【解决方案3】:

      您是否尝试过使用内置命令:

      ./manage.py dumpdata --format xml
      

      您在u'élève' 中使用 unicode 的方式没问题,所以这应该可以工作(正常化...)。

      【讨论】:

      • 我认为这个命令和这个 from django.core import serializers data = serializers.serialize("xml", SomeModel.objects.all()) 做同样的事情。我需要这个问题的格式stackoverflow.com/questions/4757402/…
      • ben alors t'as qu'à utiliser la réponse! si tu déclare bien ton xml avec un encodage utf-8 au debut, aucun souci!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2015-08-15
      相关资源
      最近更新 更多