Pau*_*jan 7 python mysql django unicode django-models
我有字符串
u"Played Mirror's Edge\u2122"
Run Code Online (Sandbox Code Playgroud)
哪个应该显示为
Played Mirror's Edge™
Run Code Online (Sandbox Code Playgroud)
但这是另一个问题.我的问题在于我将它放在模型中,然后尝试将其保存到数据库中.又名:
a = models.Achievement(name=u"Played Mirror's Edge\u2122")
a.save()
Run Code Online (Sandbox Code Playgroud)
我得到了:
'ascii' codec can't encode character u'\u2122' in position 13: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
完整堆栈跟踪(根据要求):
Traceback:
File "/var/home/ptarjan/django/mysite/django/core/handlers/base.py" in get_response
86. response = callback(request, *callback_args, **callback_kwargs)
File "/var/home/ptarjan/django/mysite/yourock/views/alias.py" in import_all
161. types.import_all(type, alias)
File "/var/home/ptarjan/django/mysite/yourock/types/types.py" in import_all
52. return modules[type].import_all(siteAlias, alias)
File "/var/home/ptarjan/django/mysite/yourock/types/xbox.py" in import_all
117. achiever = self.add_achievement(dict, siteAlias, alias)
File "/var/home/ptarjan/django/mysite/yourock/types/base_profile.py" in add_achievement
130. owner = siteAlias,
File "/var/home/ptarjan/django/mysite/django/db/models/query.py" in get
304. num = len(clone)
File "/var/home/ptarjan/django/mysite/django/db/models/query.py" in __len__
160. self._result_cache = list(self.iterator())
File "/var/home/ptarjan/django/mysite/django/db/models/query.py" in iterator
275. for row in self.query.results_iter():
File "/var/home/ptarjan/django/mysite/django/db/models/sql/query.py" in results_iter
206. for rows in self.execute_sql(MULTI):
File "/var/home/ptarjan/django/mysite/django/db/models/sql/query.py" in execute_sql
1734. cursor.execute(sql, params)
File "/var/home/ptarjan/django/mysite/django/db/backends/util.py" in execute
19. return self.cursor.execute(sql, params)
File "/var/home/ptarjan/django/mysite/django/db/backends/mysql/base.py" in execute
83. return self.cursor.execute(query, args)
File "/usr/lib/pymodules/python2.5/MySQLdb/cursors.py" in execute
151. query = query % db.literal(args)
File "/usr/lib/pymodules/python2.5/MySQLdb/connections.py" in literal
247. return self.escape(o, self.encoders)
File "/usr/lib/pymodules/python2.5/MySQLdb/connections.py" in string_literal
180. return db.string_literal(obj)
Exception Type: UnicodeEncodeError at /import/xbox:bob
Exception Value: 'ascii' codec can't encode character u'\u2122' in position 13: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
以及该模型的关键部分:
class Achievement(MyBaseModel):
name = models.CharField(max_length=100, help_text="A human readable achievement name")
Run Code Online (Sandbox Code Playgroud)
我在settings.py中使用了MySQL后端
DEFAULT_CHARSET = 'utf-8'
Run Code Online (Sandbox Code Playgroud)
所以基本上,我应该如何处理所有这些unicode的东西?如果我远离有趣的角色并坚持使用UTF8,我希望它能"正常工作".唉,似乎并不那么容易.
Pau*_*jan 12
感谢在此发帖的所有人.它确实有助于我的unicode知识(以及其他人学到的东西).
因为我试图简化我的问题并且没有提供所有信息,所以我们似乎都在咆哮错误的树.似乎我没有使用"REAL"unicode字符串,而是使用BeautifulSoup.NavigableString将其自身重命名为unicode字符串.因此所有的打印输出看起来像unicode,但它们不是.
在MySQLDB库的某个深处,他们无法处理这些字符串.
这有效:
>>> Achievement.objects.get(name = u"Mirror's Edge\u2122")
<Achievement: Mirror's Edge™>
Run Code Online (Sandbox Code Playgroud)
另一方面 :
>>> b = BeautifulSoup(u"<span>Mirror's Edge\u2122</span>").span.string
>>> Achievement.objects.get(name = b)
... Exceptoins ...
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 13: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
但这有效:
>>> Achievement.objects.get(name = unicode(b))
<Achievement: Mirror's Edge™>
Run Code Online (Sandbox Code Playgroud)
所以,再次感谢所有unicode的帮助,我相信它会派上用场.但现在 ...
警告:BeautifulSoup不会返回REAL unicode字符串,应该在执行任何有意义的操作之前强制使用unicode().