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))不起作用。与自己的影子打了两天后,我找到了一个解决方案。对于这种情况,这不是一个解决办法,而是思维的复杂变化,我必须重构整个代码
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'