作者:孙东国
标准参考
URI 的组成如下所示:
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/\_________/ \_________/ \__/
| | | | |
scheme authority path query fragment
| _____________________|__
/ \ / \
urn:example:animal:ferret:nose
根据 HTML 4.01 规范中的描述,URI 中不应该包含非 ASCII 字符。如以下 href 属性的值是不合法的:
<A href="http://foo.org/Håkon">...</A>
规范中建议,用户端在这种情况下应采取以下方式处理非 ASCII 字符:
- 将每个字符转换为 UTF-8 编码的相同字符,每个字符将有一或多个字节。
- 用 URI 编码机制对这些字节进行编码。如:每个字节转换为 %HH,其中的 HH 为这些字节的值的十六进制表示。这种方式称为“百分号编码”。
关于 URI 类型及 URI 属性值中的非 ASCII 字符(Non-ASCII characters in URI attribute values)的详细信息,请参考 HTML4.01 规范 6.4 URIs 及 附录B.2.1 中的内容。
关于“百分号编码”的详细信息,请参考 RFC-3986 2.1. Percent-Encoding 中的内容。
关于 URI 组成的更多信息,请参考 RFC-3986 3. Syntax Components 中的内容。
问题描述
对于 URI 中非 ASCII 字符,并非所有浏览器都是按照 HTML 4.01 规范中的建议实现的,而且不同浏览器在处理不同形式的 URI 时,表现也有差异。
造成的影响
这个问题将导致在服务端或客户端通过代码获取 URI 中的非 ASCII 字符信息时无法分辨编码信息,并产生乱码。
受影响的浏览器
问题分析
下面测试各种情况下各浏览器对于 URI 中非 ASCII 字符的编码方式。
在应用中经常使用的编码是 GB2312 和 UTF-8,一个汉字在 GB2312 编码下占 2 个字节,在 UTF-8 编码下占 3 个字节,因此通过对比这两种编码更容易看出区别。下面的例子中将分别使用这两种编码测试。
- 测试使用的非 ASCII 字符均为中文字符“汉”,“汉”在 GB2312 编码中的字节码为“BA BA”,在 UTF-8 编码中的字节码为“E6 B1 89”。
- 测试结果的截图中,所有字符均为 ASCII 编码,GB2312 编码的“汉”以 ASCII 编码显示时,为“ºº”,UTF-8 编码的“汉”以 ASCII 编码显示时,为“æ±ᄆ”(第三个字节在 ASCII 字符集中无对应字符,因此显示为“ᄆ”)。
- 测试的访问地址均为:
http://local.test/BrowserName/汉?汉=汉
1
为了便于区分各浏览器的表现,BrowserName 将在测试中替换为各浏览器名。
- 另外,当声明一段测试代码是 GB2312 编码时,其含义为该 HTML 文件的编码为 GB2312,并且在该文件中声明了:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
同样,当声明一段测试代码是 UTF-8 编码时,其含义为该 HTML 文件的编码为 UTF-8,并且在该文件中声明了:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
1. 在浏览器的地址栏直接输入包含非 ASCII 字符的 URI 时
在各浏览器的地址栏中,直接输入“http://local.test/BrowserName/汉?汉=汉
”,结果如下:1

可见,对于 URI 中的非 ASCII 字符:
- 在 path 部分,所有浏览器都使用了 UTF-8 并做了百分比编码。
- 在 query 部分,IE 使用了 GB2312,未做百分比编码;Firefox 和 Opera 使用了 GB2312,做了百分比编码;Chrome 和 Safari 则仍使用 UTF-8 并做了百分比编码。
2. 点击链接跳转或使用脚本跳转到包含非 ASCII 字符的 URI 时
在不同的编码下,测试以下两段代码:
<button onclick="location.href='http://local.test/BrowserName/汉?汉=汉';">go</button>
<a href="http://local.test/BrowserName/汉?汉=汉">go</a>
点击按钮或链接后,各浏览器实际发送的 URI 如下:
GB2312
 |
UTF-8
 |
可见,对于 URI 中的非 ASCII 字符:
- 在 path 部分,所有浏览器都转换为 UTF-8,做了百分比编码。
- 在 query 部分,IE 使用当前编码,未做百分比编码;其他浏览器则使用当前编码做百分比编码。
3. 使用 Ajax 请求包含非 ASCII 字符的 URI 时(get 方法)
在不同的编码下,测试以下代码:
<script>
function go(){
var xhr=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP");1
xhr.open("get","http://local.test/BrowserName/汉?汉=汉",true);2
xhr.send(null);
}
</script>
<button onclick="go();">go</button>
点击按钮后,各浏览器实际发送的 URI 如下:
GB2312
 |
UTF-8
 |
可见:
- IE 无视页面编码设置,将任意编码的字符转换为 GB2312 发送请求,并且对于 URI 中的非 ASCII 字符处理如下:
- 在 path 部分,IE6 并未处理;IE7 IE8 则做百分比编码。
- 在 query 部分,IE 并未对其处理。
- 其他浏览器对于 URI 中的非 ASCII 字符处理如下:
- 在 path 部分,均转换为 UTF-8 并做百分比编码。
- 在 query 部分,Firefox Opera 转换为 UTF-8 并做百分比编码,Chrome Safari 则使用当前编码做百分比编码。
4. 差异总结
根据以上的测试,总结各浏览器对 URI 中非 ASCII 字符的处理的差异如下:
地址栏直接输入:
浏览器
path 部分
query 部分
使用 UTF-8
百分比编码
使用 UTF-8
百分比编码
IE
是 |
是 |
否 |
否 |
Firefox Opera
是 |
是 |
否 |
是 |
Chrome Safari
是 |
是 |
是 |
是 |
点击链接跳转或使用脚本跳转:
浏览器
path 部分
query 部分
转换为 UTF-8
百分比编码
转换为 UTF-8
百分比编码
IE
是 |
是 |
否使用页面编码
|
否 |
Firefox Chrome Safari Opera
是 |
是 |
否使用页面编码
|
是 |
使用 Ajax 的 get 方法请求:
浏览器
path 部分
query 部分
使用 UTF-8
百分比编码
使用 UTF-8
百分比编码
IE6
否无视页面编码使用 GB2312
|
否 |
否无视页面编码使用 GB2312
|
否 |
IE7 IE8
否无视页面编码使用 GB2312
|
是 |
否无视页面编码使用 GB2312
|
否 |
Firefox Opera
是 |
是 |
是 |
是 |
Chrome Safari
是 |
是 |
否使用页面编码
|
是 |
解决方案
当 URI 中含有非 ASCII 字符时,不要依赖浏览器对 URI 的编码方式,以避免产生差异。建议:
- 在使用此 URI 之前,先对其进行处理,如使用 JS 的 encodeURI 或 encodeURIComponent 方法(JS 的这两个方法会将字符串转换为 UTF-8 并做百分比编码)。
- 在使用 XHR 对象发送 Ajax 请求时,如果仅在 query 部分含有非 ASCII 字符,请使用 post 方法发送,并在 send 之前使用
xhrObject.setRequestHeader("Content-Type","application/x-www-form-urlencoded")
。或者仍使用 get 方法,但在发送前使用 encodeURI 或 encodeURIComponent 方法编码。
- 经过上述处理,在此 URI 的接收端使用 UTF-8 编码来解码,如:
参见
知识库
相关问题
测试环境
操作系统版本:
Windows 7 Ultimate build 7600 |
浏览器版本:
IE6 IE7 IE8 Firefox 3.6.8 Chrome 6.0.495.0 dev Safari 5.0(7533.16) Opera 10.60 |
测试页面:
无 |
本文更新时间:
2010-08-20 |
关键字
URI URL ASCII 地址栏 中文 乱码 escape unescape encodeURI decodeURI
分享到:
相关推荐
### 三、URI中非ASCII字符的处理 在HTML4.01规范中提到,URI不应包含非ASCII字符。例如,以下链接是不合法的: ```html <a href="http://foo.org/Håkon"> ``` 对于这种情况,规范建议用户端采取一定的处理措施,...
在URI中,有一些特殊字符是被保留使用的,如果这些保留字符出现在标识符中,则必须通过百分号编码(percent-encoding)的方式进行转义处理。具体的,就是将保留字符替换为一个百分号(%)后面跟着该字符ASCII码的两...
URL编码遵循RFC 3986标准,它规定了在URL中非ASCII字符应被转换为百分号编码形式(%xy),其中xy是该字符的UTF-8编码的十六进制表示。然而,如果在编码和解码过程中没有正确处理,中文字符就可能出现乱码。 1. **...
Spring.md
内容概要:本文详细介绍了无人船、无人水下航行器(UUV)和无人车的编队控制技术,特别是虚拟结构一致性和人工势场法的应用。通过MATLAB编程实现了高效的编队控制、灵活的队形变换和可靠的避障功能。文中提供了详细的代码实现步骤,包括参数初始化、虚拟结构定义、力的计算、速度与位置更新以及效果展示。此外,还讨论了参数调整的影响,如编队控制增益、势场强度、障碍物位置设置等,展示了不同参数配置下的编队行为。 适合人群:对无人系统编队控制感兴趣的研发人员和技术爱好者,尤其是有一定MATLAB编程基础的人群。 使用场景及目标:适用于无人船、UUV和无人车的协同作业场景,旨在提高编队控制的效率和灵活性,确保编队能够安全避障并完成任务。通过调整参数,可以实现不同的编队形态和运动方式,满足多样化的实际需求。 其他说明:本文不仅提供了理论解释,还有具体的代码实现和效果展示,帮助读者更好地理解和应用相关技术。建议读者在实践中不断调整参数,探索最佳配置。
内容概要:本文详细介绍了水中有限长加肋圆柱壳体振动和声辐射的近似解析解,并提供了完整的Python实现。文中首先阐述了问题背景,即加肋圆柱壳体作为水下航行器的主要结构形式,肋骨的作用被简化为只有法向力。接着,通过一系列关键方程(如模态振动速度方程、壳体机械阻抗、特征矩阵元素等),推导出加肋圆柱壳体的振动和声辐射特性。Python代码部分实现了这些理论,包括定义`CylindricalShell`类来封装所有计算功能,如初始化参数、机械阻抗、辐射阻抗、肋骨阻抗、模态速度、辐射功率和辐射效率的计算。此外,还扩展了带刚性圆柱障板的圆柱壳体类`CylindricalShellWithBaffle`,并引入了集中力激励、简支边界条件和低频段计算的内容。最后,通过具体示例展示了如何创建壳体对象、设置参数、计算频率响应以及绘制结果图表,验证了加肋对辐射声功率和声辐射效率的影响。 适合人群:具备一定编程基础和声学基础知识的研究人员、工程师,特别是从事水下声学、船舶工程和振动分析领域的专业人员。 使用场景及目标:①通过代码实现和理论推导,深入理解加肋圆柱壳体的振动和声辐射特性;②分析肋骨对壳体声学性能的影响,优化结构设计;③利用Python代码进行数值模拟,评估不同参数配置下的声辐射效率和功率;④为实际工程项目提供理论支持和技术参考。 其他说明:本文不仅提供了详细的数学推导和Python代码实现,还讨论了实际应用中的注意事项,如参数调整、高频模态考虑、肋骨模型细化和数值稳定性处理。建议读者结合实际需求,灵活运用文中提供的理论和代码,进行更深入的研究和实践。
2115050244江涛 毕业设计开题报告(2).pdf
GoReleaser.md
介绍 上市公司劳务外包作为企业经营中的一种灵活用工模式,能够帮助企业控制人力成本、提升运营效率并优化人力资源配置,因此,近年来得到了广泛应用 随着企业对外包劳务需求的增加,劳务外包报酬数据成为了衡量外包成本及劳动市场变化的重要指标,本次对相关数据进行了分享 ## 一、上市公司劳务外包报酬数据的介绍 数据包括上市公司劳务外包报酬总额、劳务外包工时、外包工作量等关键指标,旨在帮助企业与学术界更好地理解劳务外包的经济影响 数据时间:2012-2023年 数据范围:上市公司 ## 二、数据指标
内容概要:本文详细介绍了如何利用动态规划(Dynamic Programming, DP)在MATLAB/SIMULINK环境中实现自动驾驶车辆的动态避障功能。首先,文章解释了动态规划的核心思想及其在路径规划中的应用,特别是通过状态转移方程来解决避障问题。接着,讨论了运动学模型(如自行车模型)的建立方法,以及如何通过PID和MPC控制算法进行路径跟踪和避障。此外,文章还探讨了联合仿真平台(MATLAB + Carsim + Prescan)的搭建和配置,展示了如何将理论转化为实际的仿真效果。最后,提供了完整的代码实现和调试技巧,帮助读者快速上手并优化性能。 适合人群:对自动驾驶技术和路径规划感兴趣的科研人员、工程师和技术爱好者。 使用场景及目标:适用于研究和开发自动驾驶系统,特别是在复杂环境下实现高效的动态避障功能。目标是提高车辆的安全性和智能化水平,减少人为干预。 其他说明:文中提供的代码已在GitHub上开源,读者可以直接下载并运行。需要注意的是,某些高级功能(如深度强化学习)将在后续版本中继续探索。
内容概要:本文详细介绍了如何使用 Fluent 和 LMS Virtual Lab 进行风扇气动噪声仿真。首先,通过 Fluent 对风扇进行流体动力学仿真,包括几何建模、网格划分、边界条件设置以及选择合适的湍流模型。接着,将 Fluent 中获得的压力脉动数据导入 LMS Virtual Lab,利用 FEM(有限元法)和 BEM(边界元法)分别求解风扇的气动噪声。FEM 适用于低频噪声分析,而 BEM 更适合高频噪声。最终,通过流线图、压力图、速度图和频谱图等可视化手段,分析风扇的设计合理性并找出需要改进的地方。 适合人群:从事风扇设计与优化的研究人员和技术人员,尤其是那些希望深入了解气动噪声仿真的专业人士。 使用场景及目标:①掌握 Fluent 和 LMS Virtual Lab 联合仿真的具体步骤;②学会运用 FEM 和 BEM 方法解决风扇气动噪声问题;③能够解读仿真结果,如流线图、压力图、速度图和频谱图,从而指导风扇设计优化。 其他说明:文中提供了多个实用的操作技巧和代码示例,帮助读者更好地理解和实施仿真过程。同时强调了网格质量和监测点布置的重要性,这些都是成功仿真的关键因素。
可以编译出QT 下的httpServer
dasshujv1111
内容概要:本文详细介绍了使用Python实现灰狼优化算法(GWO)求解CEC2017测试函数的方法。首先,文章解释了GWO的基本概念,即通过模拟狼群的社会行为进行优化。接着,展示了如何安装必要的库并构建GWO的核心类,包括初始化参数、计算适应度以及优化过程中的关键步骤。文中还深入探讨了三个重要的细节:包围机制、随机扰动和位置融合,它们分别对应于算法的探索能力、防止陷入局部最优以及保持种群多样性。此外,作者提供了具体的代码实例,演示了GWO在不同测试函数上的应用,并讨论了针对特定问题的参数调整策略,如改变种群大小、迭代次数和衰减方式等。最后,给出了实用建议,帮助读者更好地理解和应用这一算法。 适合人群:对优化算法感兴趣的科研人员、研究生以及有一定编程基础的数据科学家。 使用场景及目标:适用于解决复杂的连续优化问题,特别是那些具有多个局部极值点的情况。通过学习本文,读者能够掌握GWO的工作原理及其Python实现方法,从而将其应用于各种工程和技术领域的优化任务中。 其他说明:文中提到的一些技巧,如非线性的a衰减策略、改进的位置更新公式和特殊的边界处理方法,对于提高算法性能至关重要。同时,作者强调了在面对不同类型的问题时灵活调整参数的重要性。
内容概要:本文提出了一种基于校准信息传输的实时跨平台神经视频编解码器。针对现有神经视频编解码器在跨平台应用时因浮点运算误差导致解码错误的问题,作者设计了一套校准传输系统,确保编码和解码端的一致性。具体方法包括:1) 通过传输少量校准信息来修正跨平台计算不一致;2) 利用分段高斯约束减少校准信息传输量;3) 引入模型剪枝、运动降采样和算术编码跳过等加速技术,使模型能够在消费级GPU上实现实时解码(约25FPS)。实验结果表明,该方法不仅解决了跨平台解码问题,而且在性能上优于传统H.265编解码器。 适合人群:对视频编解码技术有一定了解的研究人员和技术开发者,特别是关注神经网络编解码器在实际应用中遇到的挑战和解决方案的人群。 使用场景及目标:1) 解决跨平台编解码器因浮点运算误差导致的解码失败问题;2) 实现高效、实时的视频编解码,适用于消费级硬件设备;3) 提供一种无需额外训练即可实现跨平台一致性的新方法,适用于各类视频压缩算法。 其他说明:本文的方法理论上适用于所有使用熵模型和算术编码进行实际传输的编解码方法,有助于加速现有压缩方法的实施。然而,当跨平台计算误差较大时,校准信息的传输量也会显著增加,从而影响率失真性能。未来的工作将进一步优化和推广该方法的实际应用。
2023-04-06-项目笔记-第四百六十四阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.462局变量的作用域_462- 2025-04-10
内容概要:本文档提供了一个MATLAB程序,用于计算导体球在两种介质中的镜像电荷、电容,并绘制电势和电场分布图。程序通过主菜单让用户选择不同功能模块,如固定介电常数比改变R/d、查看四种特殊情况的电势电场图、固定R/d改变介电常数比、六种R/d情况下电容与介电常数比的关系图。每个模块都详细实现了电容计算、电势和电场分布的绘制,使用了镜像法原理和梯度计算方法。程序还提供了详细的输入提示和图形化输出,方便用户理解和操作。 适合人群:具备一定MATLAB编程基础的电气工程、物理学等相关专业学生和研究人员。 使用场景及目标:①研究导体球在不同介质中的电学特性;②理解镜像电荷法的应用;③分析电容与几何参数(R/d)和介电常数比的关系;④通过可视化工具直观展示电势和电场分布。 阅读建议:此资源不仅包含完整的代码实现,还附带详细的代码注释和解释,建议读者在学习过程中逐步调试代码,理解每一部分的功能和原理,以便更好地掌握相关物理概念和编程技巧。
这份技术文档聚焦于对比度拉伸算法,这是一种用于图像灰度增强的关键技术。它借助分段线性变换,能够有效提升图像的对比度,让图像细节更清晰,广泛应用于医学影像、摄影、计算机视觉等多个领域。 文档开篇点明对比度拉伸算法的定义,深入剖析其基于分段处理和线性变换来增强图像的核心思想。在算法数学原理部分,详细列出暗部、中间和亮部三个区间的线性变换公式,并阐述各公式对图像灰度调整的具体作用,助力读者理解算法的内在逻辑。 代码实现环节以 Matlab 代码为例,从图像读取与灰度转换、参数设置、分段线性变换到结果显示,逐步解析每一步代码,包括代码的功能以及数据类型转换、逻辑索引等关键操作的目的,方便读者依此进行实践操作。 参数设置与效果分析板块,不仅清晰阐释参数的含义,还深入探讨参数调整对图像效果的影响,同时通过对比原图和拉伸后图像的特点,直观展现算法增强对比度、提升细节辨识度的显著效果。 应用场景与局限性部分,分别列举算法在医学影像处理、摄影与图像处理、计算机视觉预处理中的具体应用,凸显其重要价值;同时客观分析算法存在的参数依赖、细节失真风险以及适用范围有限等问题,为读者在实际应用中提供参考。 文档最后进行总结,强调算法灵活性高、实现简单、效果直观的优势,给出参数调试和组合使用的实践建议,并展望未来在自动化参数优化和与深度学习模型结合方面的发展方向。此外,还提供了参考资料,方便读者进一步深入研究。
内容概要:本文详细介绍了基于西门子S7-1200 PLC和博途V16的自动洗车控制系统的开发过程。主要内容涵盖硬件配置、IO表规划、程序逻辑设计(如自动/手动模式切换、急停保护、工序流程控制)以及HMI界面设计。文中还分享了多个调试技巧,如输入滤波、PID参数整定、传感器仿真等,并提供了若干优化建议和注意事项。此外,作者展示了如何利用WinCC进行图形化仿真,使调试更加直观高效。 适合人群:自动化工程师、PLC程序员、工业控制系统开发者。 使用场景及目标:适用于需要开发或维护自动洗车控制系统的专业技术人员。主要目标是帮助读者掌握S7-1200 PLC编程技巧,熟悉博途V16的使用方法,提高系统稳定性和安全性。 其他说明:文中包含大量代码片段和具体实施细节,有助于读者深入理解各个功能模块的设计思路和技术要点。同时,作者还分享了一些有趣的彩蛋和实践经验,增加了文章的趣味性和实用性。
04.第13讲一、基础概念04【公众号:研料库,料最全】.mp4