我已经研究了Unicode及其Python实现两天了,我认为我正在逐渐了解它是什么。为了更有信心,我想确认一下当前问题的假设是否正确。
在Django中,表单向我提供unicode字符串,我怀疑这些字符串可能是"损坏的"。在Python中,Unicode字符串应该编码为UTF-8,对吗?在将字符串"fähre"输入文本字段后,浏览器会在POST请求中发送字符串"f%c3%a4hre"(通过wireshark检查)。但是,当我通过form.cleaned_data检索值时,我得到了字符串u'f\xa4hre'(请注意它是一个Unicode字符串)。据我所理解的是,那是ISO-8859-1编码的Unicode字符串,这是不正确的。正确的字符串应该是u'f\xc3\xa4hre',这将是一个UTF-8编码的Unicode字符串。这是Django的一个错误还是我的理解存在问题?
为了解决这个问题,我编写了一个函数来处理Django表单中的任何文本输入:
def fix_broken_unicode(s):
return unicode(s.encode(u'utf-8'), u'iso-8859-1')
它是做什么的
>>> fix_broken_unicode(u'f\xa4hre')
u'f\xc3\xa4hre'
对我来说,这似乎不太优雅,但将Django的settings.DEFAULT_CHARSET设置为'utf-8'没有帮助,也没有其他任何帮助。我试图在整个应用程序中使用unicode,以便以后不会出现任何奇怪的错误,但显然仅标记所有字符串为u'...'是不够的。
编辑:考虑到Dirk和sth的答案,我现在将字符串按原样保存到数据库中。真正的问题是我试图对这些字符串进行urlencode,以便将它们用作Twitter API等的输入。然而,在GET或POST请求中,显然需要UTF-8编码,而标准的urllib.urlencode()函数无法正确处理它(会抛出异常)。请查看我在pastebin中的解决方案,并随时发表评论。