博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Django 中接收 URL 中的中文参数
阅读量:4053 次
发布时间:2019-05-25

本文共 1624 字,大约阅读时间需要 5 分钟。

转自:

前几天改造我那个电子课程表时,有个 URL 传递的参数我直接用了中文,像这样:/tt/getxml/?term=2008春。在 IE 中使用很正常,在 Django 里面接收之后用 request.GET.get('term') 直接就可以得到“2008春”。但是后来我用 FF 和 Safari 测试的时候就不行了。研究了一下发现还是得编码成 UTF-8 的形式传递才行。

  在客户端用 Javascript 生成 URL 时,用 encodeURI('2008春') 编码一下形成:/tt/getxml/?term=%E6%98%A5。然后再在 Django 那端用 urllib.unquote(request.GET.get('term')).decode('utf8') 接收就正常了。

  另外,用 Django 的 ORM 读取数据库,并且与 Python 自带的 xml.dom 一起来生成 XML 数据时,有中文的时候就不正常。主要还是编码问题。比如 term.name 是中文的,那么就要用 str(term.name).decode('utf-8') 来写入 xml.dom 生成的结点中,最后用 obj.toxml('utf-8') 来输出 XML 的内容。这样得出的 XML 是 UTF-8 编码的,并且在头那里会有一个 encoding="utf-8" 的属性,这个 XML 才能正确被其它地方解析。

中文URL:这个其实是很常识的东西,但是之前做web一直没注意过,在使用HttpResponseRedirect的时候,如果Redirect的URL中带中文的话,会报UnicodeEncodeError错误。解决的办法是使用urlquote对URL进行编码

from
 django.utils.http 
import
 urlquote

#
return的时候在URL前加上urlquote

return
 HttpResponseRedirect(urlquote(
"
/wiki/%s
"
 
%
 page.pagename)) 

这个URL在ie的地址栏看到的就是一堆%的东西,Firefox等好像看到的是中文

今天要处理百度贴吧的东西。想要做一个关键词的list,每次需要时,直接添加 到list里面就可以了。但是添加到list里面是中文的情况(比如‘丽江’),url的地址编码却是'%E4%B8%BD%E6%B1%9F',因此需 要做一个转换。这里我们就用到了模块urllib。
>>> import urllib
>>> data = '丽江'
>>> print data
丽江
>>> data
'\xe4\xb8\xbd\xe6\xb1\x9f'
>>> urllib.quote(data)
'%E4%B8%BD%E6%B1%9F'
那我们想转回去呢?
>>> urllib.unquote('%E4%B8%BD%E6%B1%9F')
'\xe4\xb8\xbd\xe6\xb1\x9f'
>>> print urllib.unquote('%E4%B8%BD%E6%B1%9F')
丽江
细心的同学会发现贴吧url中出现的是%C0%F6%BD%AD,而非'%E4%B8%BD%E6%B1%9F',其实是编码问题。百度的是gbk,其他的一般网站比如google就是utf8的。所以可以用下列语句实现。
>>> import sys,urllib 
>>> s = '丽江'
>>> urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
'%C0%F6%BD%AD'
>>> urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
'%E4%B8%BD%E6%B1%9F'
>>>

转载地址:http://sjxci.baihongyu.com/

你可能感兴趣的文章
No.175 - LeetCode1306
查看>>
No.176 - LeetCode1309
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
mysql:sql alter database修改数据库字符集
查看>>
mysql:sql truncate (清除表数据)
查看>>
yuv to rgb 转换失败呀。天呀。谁来帮帮我呀。
查看>>
yuv420 format
查看>>
yuv420 还原为RGB图像
查看>>
LED恒流驱动芯片
查看>>
驱动TFT要SDRAM做为显示缓存
查看>>
使用file查看可执行文件的平台性,x86 or arm ?
查看>>
qt 创建异形窗体
查看>>
简单Linux C线程池
查看>>
内存池
查看>>
GNU hello代码分析
查看>>
Qt继电器控制板代码
查看>>
wpa_supplicant控制脚本
查看>>
gstreamer相关工具集合
查看>>
RS232 四入四出模块控制代码
查看>>
linux 驱动开发 头文件
查看>>