求凤九卿6百度云

查看: 4200|回复: 8
url编码utf8 GBK问题
阅读权限70
在线时间 小时
签到天数:9 天结帖率: (15/25)
怎么才能使url编码utf8 编码出来的 用url编码GBK解出正常的文字
比如 你好 用utf8编码是 %E4%BD%A0%E5%A5%BD
用gbk解码是 浣犲ソ
一个网站提交utf8编码的数据包 但是显示出来的是gBK解码的。。。
求大神给我想想办法,万分感谢
你先确定一下,发送数据是否要
如果是中文
就算不需要编码,你的电脑也会把中文转换成
%E4%BD%A0%E5%A5%BD
这种格式然后再发送
建议你使用httpwatch 抓一下包,看看是否需要编码
我只能告诉你发送的数据编码,跟服务器返回的编码没有任何关系
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限165
在线时间 小时
签到天数: 10 天
你先确定一下,发送数据是否要& &utf8 编码& & 如果是中文&&就算不需要编码,你的电脑也会把中文转换成& &%E4%BD%A0%E5%A5%BD
&&这种格式然后再发送& &建议你使用httpwatch 抓一下包,看看是否需要编码
我只能告诉你发送的数据编码,跟服务器返回的编码没有任何关系
热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
结帖率: (9/17)
精益模块3.12
您可以选择打赏方式支持他
阅读权限70
在线时间 小时
签到天数: 9 天结帖率: (15/25)
殇桀 发表于
精益模块3.12
提交只能是utf8 URL编码的 。。。。。。。。。。。。
您可以选择打赏方式支持他
阅读权限90
在线时间 小时
结帖率: (6/7)
编码_URL解码UTF8 (“%E4%BD%A0%E5%A5%BD”)
您可以选择打赏方式支持他
阅读权限165
在线时间 小时
签到天数: 10 天
提交的和返回的一点关系都没有,是什么编码就解什么编码就行了,我们要的是效果
您可以选择打赏方式支持他
阅读权限70
在线时间 小时
签到天数: 9 天结帖率: (15/25)
ljmst 发表于
提交的和返回的一点关系都没有,是什么编码就解什么编码就行了,我们要的是效果
提交的是utf8但是网页上显示的是Gb2312,所以编程乱码了。。。。
您可以选择打赏方式支持他
阅读权限150
在线时间 小时
结帖率: (2/2)
用抓包工具 看下·· 是什么编码就转换 然后提交 就OK 勒
您可以选择打赏方式支持他
阅读权限70
在线时间 小时
结帖率: (1/6)
QQ截图56.png (9.65 KB, 下载次数: 0)
19:00 上传
您可以选择打赏方式支持他
精易论坛 - 有你更精彩 /1
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
防范网络诈骗,远离网络犯罪
违法和不良信息举报电话,企业QQ: ,邮箱:@
Powered by
粤公网安备 25温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3454)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'\t\t[转] [python]——关于中文字串与URL编码之间的转化',
blogAbstract:'事件起因嘛……不做详述。简单来说,目的就是要帮00把某个很[哔——]的工具做得再完整一点……下面开始正题。搜索baidu与google时会发现打进去的中文在地址栏里变成了“%XX%XX”格式的字符串。这种东西,在网上搜了一下资料,发现是一种被称为“URL编码”的东西。然而同样的中文转出来的URL编码也会有不同,比如百度和电玩巴士就不一样~~百度用的是GBK格式,一个中文字符转为%xx%xx,共两组而电玩巴士用的utf-8格式,一个中文字符转为%xx%xx%xx,共三组以下是网上摘到的某篇文章,很受用(嗯嗯……偶真不愧是饮水思源的好水民):',
blogTag:'',
blogUrl:'blog/static/40',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/40',
commentCount:1,
mainCommentCount:1,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}网页设计教程与开发
提供各种常见网页效果
提供各种各样的设计教程
装扮QQ,让QQ变得更酷
设计参考,提高自升水平
学习服务器和操作系统
提供各种素材和工具
收藏学习资料
您现在的位置:&&>>&&>>&&>>&&>>&正文
解决js UTF-8传参到GBK页面乱码问题
UTF-8传中文参数到GBK,之所以不行是因为其字符长度不同,1个中文在UTF-8中为3个字符,而GBK为2个字符,所以导致encodeURL后不同编码内容不一致。
  要转换编码,怎么都离不开服务器,所以最佳办法是做一个中转页面,你可以提示&正在跳转到xxx&,但是这个页面的实质是处理中文参数问题,通过js,用URl传参到中转页面,中转页面再通过$_GET来判断是否有参数,有则用iconv转换编码,然后再组合转换好的URL参数,跳转到GBK页面。
  下面是作者的一个简单的中转业,供不懂的同学参考
xmlns=&http://www.w3.org/1999/xhtml& xml:lang=&zh-CN& lang=&zh-CN&&
http-equiv=&Content-Type& content=&text/ charset=gbk& /&
&h1&正在跳转到相应服务器&&..&/h1&
&tmall& =&
&/search?commend=all&style=grid&pid=mm_&mode=66&viewIndex=10&user_type=1&q=&,
&360buy&=&
&/Search?utm_source=show.&utm_medium=tuiguang&utm_campaign=t_19195_&keyword=&,
$_GET['url'] == & && $_GET['q'] == & )
&&script&alert(&参数有误,点确定后将自动跳转回首页&);window.location.href=&http://&,$_SERVER['HTTP_HOST'],&&&/script&&;
&&script&window.location.href=&&,$url[$_GET['url']],iconv(&UTF-8&,&GBK&,$_GET['q']),&&&/script&&;
  UTF-8页面引用外部编码为GBK的JS文件编码的处理
  比如对于QQ的IP返回城市的接口的js我们使用下面的代码,可是在UTF-8页面中正常的显示GBK编码的js
type=&text/javascript& src=&/ipaddres&
charset=&gb2312&P&&/script&
  这样子我就成功的解决了在UTF-8页面中引入编码为GBK的JavaScript文件乱码问题了。而且不需要额外的写函数处理GBK转UTF-8编码,同样对于GBK页面引用编码为UTF-8编码的JavaScript文件如果出现乱码问题,可以使用下面的代码来解决
type=&text/javascript& src=&test.js&
charset=&utf-8&P&&/script&
  此方法是对于在js文件中出现汉字中文,以及其他容易造成在GBK与UTF-8编码错误字符的时候使用,对于纯英文的就不需要了。如果为了保险,加上也无妨~
转载请注明:破洛洛(谢谢合作)
上一篇文章: 下一篇文章:
网友评论:
[][][][][][][][][][]&字符是早于计算机而存在,从人类有文明那时起,人们就用一个个符号代表世间万象。如ABC,如&一、二、三&。
&字符集是所有字符的集合。
&给字符集中的每一个字符套上一个序号后的字符集。常见的XXX字符集有ASCLL字符集、Unicode字符集等等,不同种字符集为每个字符编的序号不同,包含的字符数量也不同。
GBK、UTF-8
&  GBK、UTF-8是一种编码编码格式。当然,你也可以说unicode是一种编码格式,因为它的的确确为每个字符编了一个码,没错,可是unicode的编码完全没有规律,最多只能把其当映射表用。
  我们知道,计算机只能识别1和0,假如计算机存储中文字符&字&在硬盘,肯定是存储一串二进制串。
  那么问题来了,中文字符【字】在unicode字符集中的序号是23383,那么直接把23383转化成2进制为111,然后存储在计算机里面,等需要的时候把111串拿出来,转成23383,再根据unicode映射表,找到中文字符【字】不就好吗?
  答案是否定的,如果是这样的话,那计算机怎么知道多少个1、0才代表一个字符呢?所以我们需要一种编码格式,把23383编码成有规律的1、0串,以便计算机读取。
  而GBK和UTF-8便是两种不同的有规则的编码格式。
  例如:以UTF-8为例子,假如我们所在的环境使用的是unicode字符集,那么&字&在unicode字符集中的序号是23383,转成二进制是111,使用UTF-8为其编码,以一种特定的算法(下面会具体讲这种算法),把111转化成11三个字节的二进制串,再存储到硬盘中,计算机在读取的时候,假如我们指定了让计算机以UTF-8编码格式读取并解码,计算机就会把这三个字节拿出来,倒着转回去,就能得到【字】这个中文字符了。
乱码的根源:
假如我们存储的时候,使用GBK编码格式编码,存储到硬盘,而从硬盘读取出来后,在&倒着转回去&这个步骤却使用UTF-8编码格式转回去,算法不同,那么就可能出现乱码。
如何避免乱码:
以什么编码格式存储,就用什么编码格式解。
但是,假如用户A使用GBK编码对&字&进行编码,而用户B并不知情,也没A的联系方式,跟A约定不了,无法得知硬盘中的数据是以什么编码格式编码的,怎么办呢?
解决乱码的思路:
1、随意使用一种编码格式解码,看解码后的字符串是否乱码,如果是乱码,就用另一种编码格式解码。但该方法可能误判。
2、UTF-8编码格式有一定的规律,我们可以通过正则表达式来验证是否是经过UTF-8编码后的。
JAVA自带检测乱码
boolean b = java.nio.charset.Charset.forName("GBK").newEncoder().canEncode(str);
当开始接触这种方法时,原以为java能帮我们判断乱码,就可以高枕无忧了,后来发现,该方法的成功率并不高。
但我们可以先用此方法做第一步检测,如果判断不出来,再使用第2种方法。
UTF-8的编码规律
&UTF-8形式的二进制,当一个字节时,两个字节时,三、四、五、六个字节时,都有一定的格式:
110xxxxx 10xxxxxx
1110xxxx&10xxxxxx&10xxxxxx
11110xxx&10xxxxxx&10xxxxxx&10xxxxxx
111110xx&10xxxxxx&10xxxxxx&10xxxxxx&10xxxxxx
&10xxxxxx&10xxxxxx&10xxxxxx&10xxxxxx&10xxxxxx
很明显,字节数不一样的话,第一个字节是不同的,所以第一个字节可用用来表示该字符究竟占用了多少个字节。
当计算机读取到以0xxxxxxx开头的字节,那么就代表这个字节独自就已经表示某个字符了,计算机将把这个字节单独拿出来解码。
当计算机读取到以110xxxxx开头的字节,那么就代表两个字节才能表示某个字符,计算机就把这个字节以及它后面的一个字节拿出来,代表一个字符进行解码。
而除了第一个字节外,后面的字节都是统一的10xxxxxx格式。
有了上面的有规则的格式,按到理我们就可以使用正则表达式来检测一个二进制串是否是UTF-8编码后的串,但代码中操作二进制并不方便,结合URL为16进制的特点,我们可以用正则表达式判断16进制的串。
如何构造正则表达式
我们先看看这种编码格式前一个字节的范围:
以上的范围可用计算机自行验证:
后面格式相同的字节10xxxxxx的范围:
按照这种格式,UTF-8编码格式最多可用用来表示一个1+5*6=31位的二进制串,共使用6个字节。
按照这种规律,我们先练一下手,尝试把&字&转化为UTF-8的十六进制:
java使用的字符集是unicode的,所以我们以unicode为例子。
1、找出&字&在unicdoe字符集中的序号:
public static void main(String[] args) {
System.out.println((int)'字');
结果为:23383
2、把23383转化二进制:  
可用看出,二进制共15位,按照UTF-8的编码格式,得用3个字节来表示。
我们把111从后往前分成三组:101,0111
填充到3字节的UTF-8编码格式中为:
1110xxxx &10xxxxxx &10xxxxxx
11100101 10101101 10010111
3、使用计算器把二进制转化为16进制为:
OxE5 &OxAD &Ox97
4、使用网上的验证一下,结果吻合,说明这种规律是正确的。
上面已经介绍了UTF-8的规律,那么我们借助强大的正则表达式,就可以判断一个URL串是经过什么编码格式编码的了。
先把上面的表复制下来容易观察:
1字节时:[\\x00-\\x7f]---------------------------------1
2字节时:[\\xc0-\\xdf][\\x80-\\xbf]-------------------2
3字节时:[\\xe0-\\xef][\\x80-\\xbf]{2}--------------3
4字节时:[\\xf0-\\xf7][\\x80-\\xbf]{3}--------------4
5字节时:[\\xf8-\\xfb][\\x80-\\xbf]{4}--------------5
6字节时:[\\xfc-\\xfd][\\x80-\\xbf]{5}--------------6
使用或组合在一起就是:^([\\x00-\\x7f]|[\\xc0-\\xdf][\\x80-\\xbf]|[\\xe0-\\xef][\\x80-\\xbf]{2}|[\\xf0-\\xf7][\\x80-\\xbf]{3}|[\\xf8-\\xfb][\\x80-\\xbf]{4}|[\\xfc-\\xfd][\\x80-\\xbf]{5})+$
判断过程是这样子的:例如【字】经过UTF-8编码后,为:%e5 %ad %97,共3个字节,符合第3字节的情况,第一个字节e5在[\\xe0-\\xef]范围内,后两个字节ad和97都在[\\x80-\\xbf]范围内。
所以我们可以说这个字符是经过UTF-8编码的。我们就可以使用UTF-8编码格式对其进行解码了。
java代码如下:
protected static final Pattern utf8Pattern = pile("^([\\x00-\\x7f]|[\\xc0-\\xdf][\\x80-\\xbf]|[\\xe0-\\xef][\\x80-\\xbf]{2}|[\\xf0-\\xf7][\\x80-\\xbf]{3}|[\\xf8-\\xfb][\\x80-\\xbf]{4}|[\\xfc-\\xfd][\\x80-\\xbf]{5})+$");
Matcher matcher = utf8Pattern.matcher(pureValue);
if (matcher.matches()) {
return "UTF-8";
return "GBK";
&  使用上面的方法,貌似没什么问题,不过GBK编码后是以两个两个字节呈现的,而UTF-8也有两个字节的情况,所以当一个字符经GBK编码后,转化为16进制,而刚好这个16进制的范围落入UTF-8的两个字节的范围,那么就会被误判成UTF-8,从而导致解码错误。那真的有可能会出现这种情况吗?
答案是会的,我们查看下。
发现有一部分范围落入了UTF-8的二进制范围了。
即UTF-8十六进制中两个字节的范围[\\xc0-\\xdf][\\x80-\\xbf],GBK都有。
例如上面表的第二个中文【愧】,愧的GBK十六进制是C0 A0,那么完全符合UTF-8正则表达式中二字节的[\\xc0-\\xdf][\\x80-\\xbf]这个判断,所以会被误认为是UTF-8编码。
注:该缺陷第一次看,是在下方&参考"的第一篇博客里,尝试了一下,的确有缺陷。&
尝试修复缺陷
根据下面"参考"的第一篇博客,修复的思路是把重复的区域都认为是GBK编码。
我们截取正则表达式的前两种情况(一字节、二字节的情况)来排除:^([\\x01-\\x7f]|[\\xc0-\\xdf][\\x80-\\xbf])+$
假如某个16进制串match该正则表达式,就认为是GBK编码的。
修改后的代码为:
protected static final Pattern utf8Pattern = pile("^([\\x01-\\x7f]|[\\xc0-\\xdf][\\x80-\\xbf]|[\\xe0-\\xef][\\x80-\\xbf]{2}|[\\xf0-\\xf7][\\x80-\\xbf]{3}|[\\xf8-\\xfb][\\x80-\\xbf]{4}|[\\xfc-\\xfd][\\x80-\\xbf]{5})+$");
protected static final Pattern publicPattern = pile("^([\\x01-\\x7f]|[\\xc0-\\xdf][\\x80-\\xbf])+$");
3 Matcher publicMatcher = publicPattern.matcher(str);
if(publicMatcher.matches()) {
return "GBK";
Matcher matcher = utf8Pattern.matcher(str);
if (matcher.matches()) {
return "UTF-8";
return "GBK";
&但这样一来,原本是一个字节或两字节,且是UTF-8编码的,就会被误判为GBK。。。
但是,这总比被误判成UTF-8好,因为我们查看:
可以发现,第一个中文是&一&,转化为UTF-8的话已经排到3个字节去了,所以2个字节内不会出现中文。
但是GBK中,中文是两个字节的。
所以,采用上面的修复缺陷的方法,可以保证中文不会乱码。对于某些网站,只需保证中文不会乱码即可,比如说国内的各种中文购物网站。这些网站中商品的标题一般都是中文的,用户一般以中文搜索,我们尽可能保证中文不乱码即可。
所以,该技术还是有一定用处的。
如有错误的地方,欢迎指出。
阅读(...) 评论()charset和URL编码关系 - luolonghao - ITeye技术网站
博客分类:
charset: GBK、UTF-8、EUC-KR、Shift-JIS 等URL编码:HTML form提交、JS里的encodeURIComponent函数
测试环境:
服务器:本地安装Apache,www根目录下放2个HTML页面(gbk.html和utf8.html),用Fiddler查看HTTP请求,或者tail -f access_log。
操作系统:Windows XP
浏览器版本:IE8、Firefox 10、Chrome 17、Opeara 11
form提交和encodeURIComponent的区别
form提交(application/x-www-form-urlencoded):根据当前页面的charset进行URL编码。通过submit button提交,或者用form.submit()方法提交。在gbk.html页面【土豆】会变成【%CD%C1%B6%B9】,在utf8.html页面【土豆】会变成【%E5%9C%9F%E8%B1%86】。还有,form提交会把空格替换成加号(+),这个和RFC1738不一致,PHP里对应的函数是urlencode。
encodeURIComponent函数:不管页面的charset,都按UTF-8来处理,所以在gbk.html和utf8.html页面上执行encodeURIComponent("土豆")之后都得到 【%E5%9C%9F%E8%B1%86】。encodeURIComponent完全符合RFC1738,会把空格替换成【%20】,PHP里对应的函数是rawurlencode。
浏览器地址栏行为
1. 打开encode后的URL:
打开 http://localhost/gbk.html?kw=%CD%C1%B6%B9 :
所有浏览器的地址栏直接显示 http://localhost/gbk.html?kw=%CD%C1%B6%B9。Opera比较特殊,默认隐藏GET参数部分,焦点移到地址栏时显示完整URL。
UTF-8页面:
打开 http://localhost/utf8.html?kw=%E5%9C%9F%E8%B1%86 :
IE、Opera:直接显示URL,http://localhost/utf8.html?kw=%E5%9C%9F%E8%B1%86
Firefox、Chrome:把URL解码后显示, http://localhost/utf8.html?kw=土豆
2. 打开encode前的URL:
在浏览器地址栏直接输入带中文参数的URL按回车,有些浏览器会对中文进行URL编码,这个行为在不同浏览器不太一致。
打开 http://localhost/gbk.html?kw=土豆 :
IE:无处理,发送 http://localhost/gbk.html?kw=土豆
Opera:URL编码, http://localhost/gbk.html?kw= %CD%C1%B6%B9
Firefox、Chrome:UTF8 + URL编码, http://localhost/gbk.html?kw=%E5%9C%9F%E8%B1%86
URL里带中文时需要看具体操作系统和浏览器,没有统一的标准。IE根据OS字符编码直接发送中文,Opera也是根据OS编码发送中文,只不过多一个URL编码处理。Firefox和Chrome一律按UTF-8字符处理,并进行URL编码。同事反映Firefox中文版是按OS编码发送中文,这个和Firefox本身的URL解码一起会导致BUG。
避免在URL出现中文,如果需求上要求用中文,请参考2和3。
如果不是ajax处理,并URL包含中文,一般是网站的搜索功能,这时GET请求最好以form方式提交,不要使用location.href之类的,这样可以始终保持一致的编码。
后端获取GET数据后加is_utf8判断,比如GBK项目的话,可以添加str = is_utf8(str) ? utf8_to_gbk(str) : 处理,用户直接把URL改成中文时也可以返回正确的结果。
参考文档:
论坛回复 /
(0 / 1334)
luolonghao
浏览: 82240 次
来自: Shanghai
Selenium自动化测试实战http://pan.baidu ...
Selenium Webdriver自动化测试设计视频课程下载 ...
yaogang7321 写道请问webDriver测试http ...
请问webDriver测试https网站的时候,由于证书问题不 ...
Merrygrass 写道 yum install mod_f ...

我要回帖

更多关于 凤九卿1 6百度云 的文章

 

随机推荐