url编码和unicode编码,unicode编码格式
这是什么的编码?帮忙翻译下
这个是URL编码,解码后是:我真的无语了 该放弃了 这次是真的 被气死了
URL编码格式为 %字符的编码值, 如果用Unicode编码的话就是 %u字符的unicode码值。
JS对URL进行编码和解码
Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起。
实际上,escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如"春节"的返回结果是%u6625%u8282,也就是说在Unicode字符集中,"春"是第6625个(十六进制)字符,"节"是第8282个(十六进制)字符。
它的具体规则是,除了ASCII字母、数字、标点符号"@ * _ + - . /"以外,对其他所有字符进行编码。在u0000到u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式。对应的解码函数是unescape()。
还有两个地方需要注意。
首先,无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。也就是说,Javascipt函数的输入和输出,默认都是Unicode字符。这一点对下面两个函数也适用。
其次,escape()不对"+"编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。
例如:
编码:
解码:
encodeURI()是Javascript中真正用来对URL编码的函数。
它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号"; / ? : @ = + $ , #",也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。
它对应的解码函数是decodeURI()。
例如:
编码:
解码:
最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
因此,"; / ? : @ = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。
它对应的解码函数是decodeURIComponent()。
例如:
编码:
解码:
参考文章:阮一峰:关于URL编码
url编码问题在python中怎么解决
最近在抓取一些js代码产生的动态数据,需要模拟js请求获得所需用的数据,遇到对url进行编码和解码的问题,就把遇到的问题总结一下,有总结才有进步,才能使学到的知识更加清晰。对url进行编码和解码,python提供了很方便的接口进行调用。
url中的query带有特殊字符(不是url的保留字)时需要进行编码。当url中带有汉字时,需要特殊的处理才能正确编码,以下都只针对这种情形,当然也适用于纯英文字符的url。
(1) url编码:
import urllib
url = 'wd=哈哈' ? #如果此网站编码是gbk的话,需要进行解码,从gbk解码成unicode,再从Unicode编码编码为utf-8格式。
url = url.decode('gbk', 'replace')
print urllib.quote(url.encode('utf-8', 'replace'))
结果: 3a%2f%2ftest.com%2fs%3fwd%3d%e5%93%88%e5%93%88
(2) url解码:
import urllib
encoded_url = est.com%2fs%3fwd%3d%e5%93%88%e5%93%88'
print urllib.unquote(encoded_url).decode('utf-8', 'replace').encode('gbk', 'replace') ?#反过来
函数调用的参数以及结果都是utf-8编码的,所以在对url编码时,需要将参数串的编码从原始编码转换成utf-8,
对url解码时,需要将解码结果从utf-8转换成原始编码格式。
依据网站采用的编码不同,或是gbk或是utf-8,赋赋予不同的编码,进行不同的url转码。GBK格式,一个中文字符转为%xx%xx,共两组;utf-8格式,一个中文字符转为%xx%xx%xx,共三组。
?import?sys,urllib?
?s?=?'杭州'
?urllib.quote(s.decode(sys.stdin.encoding).encode('gbk'))
%BA%BC%D6%DD
?urllib.quote(s.decode(sys.stdin.encoding).encode('utf8'))
'%E6%9D%AD%E5%B7%9E'
[python]?view plain?copy
a?=?"墨西哥女孩被拐4年接客4万次?生的孩子成为人质-搜狐新闻"
print?urllib.quote(urllib.quote(a))
进行两次编码转换后,会变为:%25E5%25A2%25A8%25E8%25A5%25BF%25E5%2593%25A5%25E5%25A5%25B3%25E5%25AD%25A9%25E8%25A2%25AB%25E6%258B%25904%25E5%25B9.................................................................................这样的形式。
同样需要两次解码后才能得到中文。
最近用python写了个小爬虫自动下点东西,但是url 是含中文的,而且中文似乎是 gbk 编码然后转成 url的。举个例子吧,我如果有个unicode字符串“历史上那些牛人们.pdf”,那么我转换成url之后是,?
t="%20%E5%8E%86%E5%8F%B2%E4%B8%8A%E9%82%A3%E4%BA%9B%E7%89%9B%E4%BA%BA%E4%BB%AC.pdf",?
但是对方网站给的是 s="%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF"
print urllib.unquote("%C0%FA%CA%B7%C9%CF%C4%C7%D0%A9%C5%A3%C8%CB%C3%C7.PDF").decode('gbk').encode('utf-8')
历史上那些牛人们.PDF
IE浏览器兼容之URL编码
问题场景:文件上传,在谷歌里可以正常操作,IE浏览器操作出错,服务请求报错。HTTP 400 错误 - 请求无效 (Bad request)
问题分析:对比两个请求可以发现,二者的请求URL不一致。jsp通过url请求传递参数给后端,但是url的格式不对会造成请求失败。这种url的问题常发生在在IE浏览器中,其他浏览器火狐、chrome等不会有问题。因为谷歌中会自动给空格和一些特殊字符编码,而IE没有这一步。
解决办法:手动给url编码。在文件upload的方法里对url进行两次编码
encodeURI(encodeURI(url))
以上问题涉及的知识:
1、http请求过程:
浏览器把URL(以及post提交的内容)经过编码后发送给服务器。
?服务器将对内容解码,进行处理,再把结果编码返回给浏览器。
?浏览器按照指定的编码显示该网页。
字符串编码和解码时涉及到的字符集,如ISO8859-1、GBK、UTF-8、UNICODE。
2、URL编码
(1)URL编码特点:
由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。
URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符。
URL 不能包含空格。URL 编码通常使用 + 来替换空格。
(2)URL编码方法
escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。escape()不对"+"编码 主要用于汉字编码,现在已经不提倡使用。
encodeURI()是Javascript中真正用来对URL编码的函数。编码整个url地址,但对特殊含义的符号"; / ? : @ = + $ , #",也不进行编码。对应的解码函数是:decodeURI()。
encodeURIComponent() 能编码"; / ? : @ = + $ , #"这些特殊字符。对应的解码函数是decodeURIComponent()。假如要传递带符号的网址,所以用encodeURIComponent()
原博文: IE浏览器兼容之URL编码
计算机常用的信息编码有哪几种?
计算机常用的编码有:ASCII码,汉字编码等
字符编码就是以二进制的数字来对应字符集的字符,目前用得最普遍的字符集是ANSI,对应ANSI字符集的二进制编码就称为ANSI码,DOS和Windows系统都使用了ANSI码,但在系统中使用的字符编码要经过二进制转换,称为系统内码。?????????????????????????????????????????????????????????????????????? ???? ????? 1.汉字内码:ANSI码是单一字节(8位二进制数)的编码集,最多只能表示256个字符,不能表示众多的汉字字符,各个国家和地区在ANSI码的基础上又设计了各种不同的汉字编码集,以能够处理大数量的汉字字符。这些编码使用单字节来表示ANSI的英文字符(即兼容ANSI码),使用双字节来表示汉字字符。由于一个系统中只能有一种汉字内码,不能识别其它汉字内码的字符,造成了交流的不便。????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 2.GB码:GB码是1980年国家公布的简体汉字编码方案,在大陆、新加坡得到广泛的使用,也称国标码。国标码对6763个汉字集进行了编码,涵盖了大多数正在使用的汉字。????????????????????????????????? 3.GBK码:GBK码是GB码的扩展字符编码,对多达2万多的简繁汉字进行了编码,简体版的Win95和Win98都是使用GBK作系统内码。?????????????????????????????????????????????????????????????????????????????????????????? 4.BIG5码:BIG5码是针对繁体汉字的汉字编码,目前在台湾、香港的电脑系统中得到应用。??? ??? 5.HZ码:HZ码是在Internet上广泛使用的一种汉字编码。?????????????????????????????????????????????????? ???? ??? 6.ISO -2022CJK码:IOS-2022是国际标准组织(ISO)为各种语言字符制定的编码标准。采用二个字节编码,其中汉语编码称ISO- 2022 CN,日语、韩语的编码分别称JP、KR。一般将三者合称CJK码。目前CJK码主要在Internet网络中使用。??????????????????????????????????????? ???????????????????????????????? 7.Unicode码:Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容。目前,在网络、Windows系统和很多大型软件中得到应用。