为了账号安全,请及时绑定邮箱和手机立即绑定

关于python编码问题的疑惑

关于python编码问题的疑惑

当年话下 2019-02-25 08:30:08
初学python,今天在使用django的时候遇到一些编码问题,希望大神指教下。 # coding:utf-8 from django.http import HttpResponse def index(request): return HttpResponse("这是首页") def news(request, news_id): return HttpResponse("新闻ID是:%s" % news_id) 我在访问index方法的时候不会报错,但是访问news方法的时候却报错,只有把第二个方法加上u,也就是这样才能正确输出 def news(request, news_id): return HttpResponse(u"新闻ID是:%s" % news_id) 我想问加上u之后python到底干了什么动作,为什么第一个index方法就可以正常输出?
查看完整描述

3 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

因为传给 view 函数的参数的值都是 unicode 字符串, 所以:

return HttpResponse("新闻ID是:%s" % news_id)

实际上执行的是 :

return HttpResponse("新闻ID是:%s" % u'2')

% u'2' 的时候因为参数是 unicode 字符串,所以 python 会尝试将 "新闻ID是:%s" decode 为 unicode 字符串,而默认 decode 时的编码是 ascii 无法 decode "新闻ID是:%s",所以报错。

测试验证:

>>> "新闻ID是:%s" % u'2'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)
>>> "ID is :%s" % u'2'
u'ID is :2'
>>>

u 后是两个 unicode 字符串进行格式话,没问题 :

return HttpResponse(u"新闻ID是:%s" % u'2')

>>> u"新闻ID是:%s" % u'2'
u'\u65b0\u95fbID\u662f:2'
>>>
查看完整回答
反对 回复 2019-03-04
  • 3 回答
  • 0 关注
  • 458 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信