Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么Django管理员尝试将字符串编码为ASCII而不是Unicode?或者这个错误与它看起来的不同?_Python_Django_Unicode_Encoding_Django Admin - Fatal编程技术网

Python 为什么Django管理员尝试将字符串编码为ASCII而不是Unicode?或者这个错误与它看起来的不同?

Python 为什么Django管理员尝试将字符串编码为ASCII而不是Unicode?或者这个错误与它看起来的不同?,python,django,unicode,encoding,django-admin,Python,Django,Unicode,Encoding,Django Admin,我有以下错误: 模板语法错误位于 /管理/结果\u cop/copsegmentresult/ 呈现时捕获到异常: (‘ascii’、‘ISU’欧洲花样滑冰 2009年锦标赛:高级女士 女士们:简短节目-2.苏珊娜 P\xc3\x96YKI\xc3\x96',98,99, '序号不在范围内(128)') 不会呈现的字符串片段是:pÖYKIÖ 我不明白为什么Django试图将字符串呈现为ASCII,为什么不是UTF-8 编辑1: 我忘了问——我也很想知道如何消除这个错误;) 编辑2: 博宾斯的回答

我有以下错误:

模板语法错误位于 /管理/结果\u cop/copsegmentresult/

呈现时捕获到异常: (‘ascii’、‘ISU’欧洲花样滑冰 2009年锦标赛:高级女士 女士们:简短节目-2.苏珊娜 P\xc3\x96YKI\xc3\x96',98,99, '序号不在范围内(128)')

不会呈现的字符串片段是:pÖYKIÖ

我不明白为什么Django试图将字符串呈现为ASCII,为什么不是UTF-8

编辑1: 我忘了问——我也很想知道如何消除这个错误;)

编辑2: 博宾斯的回答是正确的:)我有一些大致的想法:

def __unicode__(self):
    return "%s %s" (self.foo, self.bar)

我猜你是在要求Django呈现一个字节字符串。开始时无
u

'ISU European Figure Skating Championships 2009: Senior Ladies Ladies: Short Program - 2. Susanna P\xc3\x96YKI\xc3\x96'
因此Django可能正试图将其编码为页面的编码,大概是UTF-8。但是字节字符串不能直接编码;它们必须首先是Unicode字符串。Python本身使用默认编码(通常为
ascii
)执行此转换步骤

>>> 'P\xc3\x96YKI\xc3\x96'.encode('utf-8')
UnicodeDecodeError

因此,您需要做的是在发送到模板之前,通过UTF-8解码将该字节字符串转换为Unicode字符串。它是从哪里来的?通常,您应该将应用程序中的所有内容字符串作为Unicode字符串保存。

如果有人对bobince的答案感到困惑,请考虑以下内容:

模型中的字段已采用unicode格式

当您有这样的unicode函数时:

def __unicode__(self):
  return "{0}".format(self.field_one)
它实际上返回了一个ASCII字符串(这意味着,它将尝试将字段_one转换为ASCII),如果字段_one包含ASCII以外的字符,您将遇到如上所述的问题

现在考虑这个Unicode函数:

def __unicode__(self):
      return self.field_one
这很好,因为您直接返回unicode字符串,不需要转换

让我们重温一下第一个unicode函数,要使其正常工作,只需添加
u
,使其成为unicode字符串

def __unicode__(self):
      return u"{0}".format(self.field_one)

你能提供你的copsegmentresult模型吗?它是有uuuUnicode方法还是只有uuustr方法?是的,请把代码发到哪里。Django完全能够处理UTF-8,但您必须告诉它这就是您想要的。谢谢:)将文本更改为u“%s%s”确实解决了问题:)这是事实,但我们在应用程序中只使用了中文字符。当您使用
“%s%”(self.field)
-它适用于Unicode中的波兰语字符,以及其他几种常见情况。但对于来自深度扩展unicode(16位以上,或“平面0”)的中文字符(不确定是繁体还是简体),它崩溃了。切勿在
\uuuUnicode\uuuuUnicode
中使用
'{0}.format()
——即使是波兰语字符也会崩溃。坚持这个答案是可以的,即
u'{0}.format(self.field.\uuuUnicode\uuuuUnicode())
-我有时会显式添加方法调用。django捕获unicode输入,所以
>>a=u”我" >>> 格式(a)u'\u6211'
我还发现了一种相关的文档错误