细谈 URL 编码

本文探讨了浏览器与服务器间中文字符的编码差异,分析了百度与谷歌搜索框中中文关键词的编码方式,并介绍了不同场景下的编码解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创,欢迎转载,请标明来源:http://chen-gengjia.iteye.com/blog/969979

 

当我们用百度搜索的时候,在搜索框打入中文关键字,但地址栏的搜索词却变成了%xx 的形式,用谷歌搜索,虽然地址栏关键词还是我们打入的,但复制出来看看,是不是变了呢?再对比一下同样的中文在百度和谷歌下变成的百分号串是不是一样?很明显,浏览器发出搜索请求时,对关键词进行了编码,而且百度谷歌的编码还是不一样的。


事实上,WEB客户端和服务端的数据交换之中,要进行多次编码,具体编码的方式与浏览器及其设置、服务端设置、页面设置都有关系,大家肯定有一个疑惑,对这么一个基本的功能,为什么没有标准呢?请看


混乱的编码:http://www.uedmagazine.com/ued/index.php?entry=entry100217-213747


看了上面这篇,是不是有点清晰又有点混乱呢?說实话,这篇帖子半好半坏,总结一下它给出的知识:


1. 百度搜索框发送请求时,中文(事实上只要是非保留字符都会被编码,这是RFC规定的)会被编码成 gb2312的百分号码,而谷歌会将中文编码为utf-8的百分号码发送,这样就解释了为什么同样的文字关键词地址栏会不宜样,因为他们页面设置的编码是不一样的,查看百度源代码可见 meta 标签规定了 charset="gb2312",谷歌的看不出来,但测试发现应该是utf-8


2.如果不是通过搜索栏的form提交请求,而是直接在地址栏中将关键词部分写上一个中文,发现百度和谷歌一样是 utf-8 百分号编码,(ff 地址栏看不出来,因为它显示的时候自动做了一次 decode,需要复制出来再看),初步结论是,直接通过URL请求时的编码是受本地操作系统默认编码决定的,因为在百度页面查看ff的编码显示是 gbk,但实际复制出来的编码还是 utf-8


这第二点的发现就可以解释为什么服务端在做链接到其他页面时,url string 需要做统一的编码,如 php 的 urlencode 或者 python 的 urllib.quote ,因为如果你直接将中文参数接在URL string 上,由于客户端的操作系统/浏览器配置不一样,它发出请求时做的编码就不一样,这样,服务端新页面接受参数时很有可能出现乱码!也就是說,在服务端用 urlencode 等编码函数编码链接参数,实际上是帮浏览器做了工作,从而消除不同浏览器工作标准不同带来的麻烦。


3. 如果用经过一定编码的字符作为搜索关键词会产生什么后果?百度实验结果发现,搜索框提交经过gb2312编码的关键字,结果不能匹配,比如‘大学’的gb2312编码是 ‘%B4%F3%D1%A7’,(可以在第一次提交搜索请求时在地址栏复制),将%B4%F3%D1%A7放到搜索栏提交,返回结果跟‘大学’没关系(此时地址栏关键字是%25B4%25F3%25D1%25A7)。如果将%B4%F3%D1%A7放到URL里直接提交呢?呵呵,肯定返回正确结果了,因为相当于我们人工帮浏览器做了编码,浏览器没有发现非保留字符就直接提交了。前面說了直接在URL打入中文提交会根据操作系统(本机是utf-8去做编码),那么意味着百度服务端对 gb2312 和 utf-8 两种百分号编码都支持,我们直接在URL中将关键词替换为 “%E5%A4%A7%E5%AD%A6”(大学的utf-8编码),结果不出所料,返回正常。对谷歌的测试差不多。这样,前面那篇文章关于百度不支持 utf-8 的说法显然已经过时了。


关于浏览器发送数据时的编码,请看


http://web.nchu.edu.tw/~jlu/classes/xml/ajax/urlencoding.shtml

http://web.nchu.edu.tw/~jlu/classes/xml/ajax/urlencoding2.shtml

http://web.nchu.edu.tw/~jlu/classes/xml/ajax/urlencoding3.shtml

http://web.nchu.edu.tw/~jlu/classes/xml/ajax/urlencoding4.shtml


上面四篇写得非常好,基本上能将编码问题理解清楚,我们总结一下,编码的不一致有两个维度,第一是浏览器的区别;第二是发送点的区别;两个维度下各种比较,请看

 

http://blog.youkuaiyun.com/wangjun_1218/archive/2009/07/08/4330244.aspx


1. form 表单的情况,所有浏览器都是根据meta编码,所以只要整个网站设定统一的页面编码就可以解决

2.ajax发送数据的情况,不同浏览器方案不同,最好先用javascript编码函数做处理 ,最推荐用的是 encodeURIComponent ,关于 javascript的编码,请看

 

http://xkr.us/articles/javascript/encode-compare/   ,

 

其思路跟服务端方案是一致的,发送 ajax 前,先同一对数据进行编码而不是直接发送中文等非保留字符,这样浏览器就不用再去编码(因为不会受不同主机和浏览器的不同而导致发送到服务端的编码不一致),服务端就可以用统一的解码方式去处理用户数据

3. 链接发送参数数据,ff会做一个urlcode(根据内码编码后再用百分号的形式组织),ie直接根据内码发送,不同客户端系统的内码又有可能不一样,所以服务端应该用urlencode等函数做统一编码,具体见上面

4.直接地址栏发送请求,同3,ff 会做一个urlencode,ie 直接根据内码发送

 

 

 

根据上面粗略的说明,之所以要使用javascript 的 encodeURIComponent 和 php 的 urlencode 等客户端/服务端编码函数,原因主要是浏览器厂商的不兼容导致的,虽然有了同一的RFC标准,但是人家不遵守我们小小的 web开发人员又能奈何,只能利用服务端语言提供的编码函数或客户端脚本提供的编码函数,在需要两端交互数据时做必要的编码,让我们用程序语言替浏览器把这分活干了,免得不同浏览器打架,所谓编码,其实就是这么回事

标题基于SpringBoot+Vue的学生交流互助平台研究AI更换标题第1章引言介绍学生交流互助平台的研究背景、意义、现状、方法与创新点。1.1研究背景与意义分析学生交流互助平台在当前教育环境下的需求及其重要性。1.2国内外研究现状综述国内外在学生交流互助平台方面的研究进展与实践应用。1.3研究方法与创新点概述本研究采用的方法论、技术路线及预期的创新成果。第2章相关理论阐述SpringBoot与Vue框架的理论基础及在学生交流互助平台中的应用。2.1SpringBoot框架概述介绍SpringBoot框架的核心思想、特点及优势。2.2Vue框架概述阐述Vue框架的基本原理、组件化开发思想及与前端的交互机制。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue在学生交流互助平台中的整合方式及优势。第3章平台需求分析深入分析学生交流互助平台的功能需求、非功能需求及用户体验要求。3.1功能需求分析详细阐述平台的各项功能需求,如用户管理、信息交流、互助学习等。3.2非功能需求分析对平台的性能、安全性、可扩展性等非功能需求进行分析。3.3用户体验要求从用户角度出发,提出平台在易用性、美观性等方面的要求。第4章平台设计与实现具体描述学生交流互助平台的架构设计、功能实现及前后端交互细节。4.1平台架构设计给出平台的整体架构设计,包括前后端分离、微服务架构等思想的应用。4.2功能模块实现详细阐述各个功能模块的实现过程,如用户登录注册、信息发布与查看、在线交流等。4.3前后端交互细节介绍前后端数据交互的方式、接口设计及数据传输过程中的安全问题。第5章平台测试与优化对平台进行全面的测试,发现并解决潜在问题,同时进行优化以提高性能。5.1测试环境与方案介绍测试环境的搭建及所采用的测试方案,包括单元测试、集成测试等。5.2测试结果分析对测试结果进行详细分析,找出问题的根源并
内容概要:本文详细介绍了一个基于灰狼优化算法(GWO)优化的卷积双向长短期记忆神经网络(CNN-BiLSTM)融合注意力机制的多变量多步时间序列预测项目。该项目旨在解决传统时序预测方法难以捕捉非线性、复杂时序依赖关系的问题,通过融合CNN的空间特征提取、BiLSTM的时序建模能力及注意力机制的动态权重调节能力,实现对多变量多步时间序列的精准预测。项目不仅涵盖了数据预处理、模型构建与训练、性能评估,还包括了GUI界面的设计与实现。此外,文章还讨论了模型的部署、应用领域及其未来改进方向。 适合人群:具备一定编程基础,特别是对深度学习、时间序列预测及优化算法有一定了解的研发人员和数据科学家。 使用场景及目标:①用于智能电网负荷预测、金融市场多资产价格预测、环境气象多参数预报、智能制造设备状态监测与预测维护、交通流量预测与智慧交通管理、医疗健康多指标预测等领域;②提升多变量多步时间序列预测精度,优化资源调度和风险管控;③实现自动化超参数优化,降低人工调参成本,提高模型训练效率;④增强模型对复杂时序数据特征的学习能力,促进智能决策支持应用。 阅读建议:此资源不仅提供了详细的代码实现和模型架构解析,还深入探讨了模型优化和实际应用中的挑战与解决方案。因此,在学习过程中,建议结合理论与实践,逐步理解各个模块的功能和实现细节,并尝试在自己的项目中应用这些技术和方法。同时,注意数据预处理的重要性,合理设置模型参数与网络结构,控制多步预测误差传播,防范过拟合,规划计算资源与训练时间,关注模型的可解释性和透明度,以及持续更新与迭代模型,以适应数据分布的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值