我已经研究了 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 请求中,显然需要标准 urllib.urlencode() 函数所做的 UTF-8 编码处理不正确(抛出异常)。看看我在 pastebin 中的解决方案,并随时对其发表评论。
最佳答案
u'f\xa4hre'
是一个 unicode 字符串,未编码为任何内容。 unicode 代码点 0xa4
是字符 ä
。在 ISO-8859-1 中 ä
也被编码为字节 0xa4
并不重要。
unicode 字符串可以包含任何 unicode 字符,而无需以某种方式对其进行编码。例如 轮渡
将表示为 u'\u8f6e\u6e21'
,它只是两个 unicode 代码点。 UTF-8 编码将是更长的 '\xe8\xbd\xae\xe6\xb8\xa1'
。
因此无需修复编码,您只是看到 unicode 字符串的内部表示。
关于python - "Broken"Unicode 字符串以 UTF-8 编码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2415628/