0

0

Nodejs如何处理IE诡异的非英文URL编码

php中文网

php中文网

发布时间:2016-06-06 20:32:35

|

1813人浏览过

|

来源于php中文网

原创

众所周知url里是不能出现除了英文数字和某些特殊符号外的其他字符的,也不能出现汉字。url会出现汉字也就4种情况:

  1. 网址路径(path)中包含汉字:如 https://zh.wikipedia.org/wiki/浏览器
  2. Get方法生成包含汉字的URL:一般是由表单生成的,比如 https://zh.wikipedia.org/w/index.php?search=%E6%B5%8F%E8%A7%88%E5%99%A8
  3. 查询字符串(Query String)包含汉字:比如 https://zh.wikipedia.org/w/index.php?search=浏览器 与第二种不同的是直接在浏览器地址栏输入汉字
  4. Ajax调用的URL包含汉字: 比如

在第一种情况下,各浏览器始终使用UTF-8编码,也就是最后被解析成了 https://zh.wikipedia.org/wiki/%E6%B5%8F%E8%A7%88%E5%99%A8
第二种情况则是根据当前页面编码进行转义,2中的例子用的就是UTF-8
第三种情况就相当诡异了,Chrome和FF都使用UTF-8进行转义,而IE则不是。查了一下,IE用的是操作系统的默认编码,据我所知这个默认编码在不同Windows版本和不同系统语言下都不一样。
第四种情况和第三类似,IE使用系统默认而Chrome和FF使用UTF-8。

于是乎服务器拿到第三和第四种的请求后,根本不知道用的是什么编码。第四种倒容易解决,提前用JavaScript指定编码转义一次就好。但是第三种就...

于是说服务器如何确定在第三种情况发来的发来的查询字符串真正内容?这里用的是Nodejs,可以的话也想听听PHP的解决方案。

试了一个貌似在IE下,用第三种情况搜索Wordpress也会返回404(用错误解码方式的关键词查询数据库没有找到结果)。

通义灵码
通义灵码

阿里云出品的一款基于通义大模型的智能编码辅助工具,提供代码智能生成、研发智能问答能力

下载

=============
突然想到一个点子,能不能从请求header的UA判断是否为IE,如果是再通过Accept-Language来猜测编码...(我开始乱来了....

回复内容:

众所周知url里是不能出现除了英文数字和某些特殊符号外的其他字符的,也不能出现汉字。url会出现汉字也就4种情况:

  1. 网址路径(path)中包含汉字:如 https://zh.wikipedia.org/wiki/浏览器
  2. Get方法生成包含汉字的URL:一般是由表单生成的,比如 https://zh.wikipedia.org/w/index.php?search=%E6%B5%8F%E8%A7%88%E5%99%A8
  3. 查询字符串(Query String)包含汉字:比如 https://zh.wikipedia.org/w/index.php?search=浏览器 与第二种不同的是直接在浏览器地址栏输入汉字
  4. Ajax调用的URL包含汉字: 比如

在第一种情况下,各浏览器始终使用UTF-8编码,也就是最后被解析成了 https://zh.wikipedia.org/wiki/%E6%B5%8F%E8%A7%88%E5%99%A8
第二种情况则是根据当前页面编码进行转义,2中的例子用的就是UTF-8
第三种情况就相当诡异了,Chrome和FF都使用UTF-8进行转义,而IE则不是。查了一下,IE用的是操作系统的默认编码,据我所知这个默认编码在不同Windows版本和不同系统语言下都不一样。
第四种情况和第三类似,IE使用系统默认而Chrome和FF使用UTF-8。

于是乎服务器拿到第三和第四种的请求后,根本不知道用的是什么编码。第四种倒容易解决,提前用JavaScript指定编码转义一次就好。但是第三种就...

于是说服务器如何确定在第三种情况发来的发来的查询字符串真正内容?这里用的是Nodejs,可以的话也想听听PHP的解决方案。

试了一个貌似在IE下,用第三种情况搜索Wordpress也会返回404(用错误解码方式的关键词查询数据库没有找到结果)。

=============
突然想到一个点子,能不能从请求header的UA判断是否为IE,如果是再通过Accept-Language来猜测编码...(我开始乱来了....

这个问题和IE没多大关系...
btw: 你后面提到的 通过Accept-Language来猜测编码更是不靠谱.
因为这个 请求头是 告诉服务器 浏览器支持什么样的语言(Language), 与本次提交时参数的编码没有任何关系.

你遇到的问题, 主要是后端的编码识别的问题.

测试代码:
1.html 文档声明内容编码为 utf-8, 且文件保存编码为 utf-8.
不管是在IE还是Chrome,Firefox下, 点按钮提交的汉字均为utf-8编码.



 
  
 

 


2.html 文档声明内容编码为 gb2312, 且文件保存编码为 gb2312.
不管是在IE还是Chrome,Firefox下, 点按钮提交的汉字均为gb2312编码.



 
  
 

 


上面两种编码提交到 www.baidu.com 进行搜索时, 百度均可识别出来正确的汉字.

GB2312编码时的URL地址: http://www.baidu.com/s?wd=%E4%AF%C0%C0%C6%F7
UTF-8编码时的URL地址: http://www.baidu.com/s?wd=%E6%B5%8F%E8%A7%88%E5%99%A8

认清楚问题之后, 就可以去找正确的答案了:
百度搜索关键字PHP 汉字 编码 识别(Google被墙,所以只能用百度代替了)
由编码识别遇到问题,思考utf8编码正则表达式(php版本)

将上面的测试代码的action指向下面这个php文件.
你会发现不管是 GB2312 编码提交过来的数据, 还是 UTF-8 编码提交过来的数据, 都可以正确显示所提交的汉字.



Nodejs如何处理IE诡异的非英文URL编码

Nodejs如何处理IE诡异的非英文URL编码

这里是以PHP为例, nodejs 与此类似.

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.3万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号