Python DjangoUnicode数据库错误:[错误的Unicode数据]

Python DjangoUnicode数据库错误:[错误的Unicode数据],python,django,unicode,python-unicode,Python,Django,Unicode,Python Unicode,模型: class ItemType(models.Model): name = models.CharField(max_length=100) def __unicode__(self): logger.debug("1. Item Type %s created" % self.name) return self.name 守则: (...) type = re.search(r"Type:(.*?)",text) itemtype = It

模型:

class ItemType(models.Model):
  name = models.CharField(max_length=100)
  def __unicode__(self):
    logger.debug("1. Item Type %s created" % self.name)
    return self.name 
守则:

  (...)
    type = re.search(r"Type:(.*?)",text)
    itemtype = ItemType.objects.create(name = name.group(1), defaults={'name':name.group(1)})
    logger.debug("2. Item Type %s created" % name.group(1))
    logger.debug("4. Item Type %s created" % itemtype.name)
    logger.debug("3. Item Type %s created" % itemtype)
结果是出乎意料的(当然对我来说):

第一个
logger.debug
按预期打印创建的
项目类型
,但第二个会引发错误:

DjangoUnicodeDecodeError: 'ascii' codec can't decode byte  in position : 
ordinal not in range(128). 
You passed in <ItemType: [Bad Unicode data]> (<class 'aaa.models.ItemType'>)
那么为什么要调试3。不能打印吗

更新2 问题在于:

  itemtype = ItemType.objects.create(name = name.group(1), defaults={'name':name.group(1)})
如果我把它换成

  itemtype = ItemType.objects.create(name = name.group(1), defaults={'name':u'ĄĆĘŃŁÓŚ'})
一切都很好


那么如何将其转换为unicode呢?unicode(name.group(1))不起作用。

与自己的影子打了两天后,我找到了一个解决方案。对于这种情况,这不是一个解决办法,而是思维的复杂变化,我必须重构整个代码

  • 我假设每个字符串都是UNICODE。如果它不是-修复它

  • 不要使用“%s”或“某物”始终使用u“%s”和u“cośtam”

  • 在每个具有models.CharField()或其他面向“文本”的字段的模型中,我重写save()方法:
  • 例如:

    class ItemType(models.Model):
      name = models.CharField(max_length=100)
    
      def save(self, *args, **kwargs):
        if isinstance(self.name, str):
          self.name=self.name.decode("utf-8")
        super(ItemType, self).save(*args, **kwargs)
    
    解释-如果名称以某种方式用str而不是unicode填充,请将其更改为unicode

    我是如何发现这一点的:

    我想知道models.CharField中的文本是什么类型,然后发现,如果你用unicode填充它-它是unicode,如果你用str填充它-它是str。所以如果你用unicode“手工”填充它,而在其他地方用regex填充它-结果是出乎意料的

    unicode和str的最大问题是,在这两种语言中都使用双字符是没有问题的:

    >>> text_str = "żółć"
    >>> text_unicode = u"żółć"
    >>> print text_str
    żółć
    >>> print text_uni
    żółć
    
    所以你看不出有什么不同

    但如果使用其他命令:

    >>> text_str
    '\xc5\xbc\xc3\xb3\xc5\x82\xc4\x87'
    >>> text_uni
    u'\u017c\xf3\u0142\u0107'
    
    这一差别显而易见

    如果有一些设置将打印(和类似)的行为更改为:

    一切都将更容易调试-如果你能看到DIATTRICS它是好的-如果没有-它是坏的

    使用解码('utf-8')使我找到了解决方案:

    >>> text_str
    '\xc5\xbc\xc3\xb3\xc5\x82\xc4\x87'
    >>> text_str.decode('utf-8')
    u'\u017c\xf3\u0142\u0107'
    >>> text_uni
    u'\u017c\xf3\u0142\u0107'
    

    您正在使用哪个数据库?神谕您还可以尝试更改为logger.debug(“1.Item Type%s created”,self.name)。在记录器中,避免使用“%”。更改为logger.debug(itemtype)相同的错误当您将包含非英语字符(超过128个Unicode字符)的Unicode字符串传递给需要ASCII bytestring的对象时,会发生此错误。Python bytestring的默认编码是ASCII,“它精确地处理128个(英文)字符”。这就是为什么试图转换超过128的Unicode字符会产生错误。请参阅您的Postgres是否配置为接受unicode?是的,Postgres配置正确。但如果我添加u“żółć”而不是regex结果模型debug打印预期值,我不能同意create需要ascii。我认为我必须对结果进行编码,但编码和unicode的方式不起作用。
    >>> print text_str
    '\xc5\xbc\xc3\xb3\xc5\x82\xc4\x87'
    >>> print text_uni
    żółć
    
    >>> text_str
    '\xc5\xbc\xc3\xb3\xc5\x82\xc4\x87'
    >>> text_str.decode('utf-8')
    u'\u017c\xf3\u0142\u0107'
    >>> text_uni
    u'\u017c\xf3\u0142\u0107'