`
jolestar
  • 浏览: 197101 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

搜索引擎URI编码的处理

阅读更多

做一个站内搜索遇到一个问题:

网站全站使用的是UTF-8编码,所以get请求的URL也用UTF-8编码,服务器端用UTF-8解码。这种情况下,用户直接在表单里输入提交过来搜索,是没有问题的。但如果用户直接在浏览器地址栏里把关键词给改了,提交过来,或者从浏览器地址栏的下拉提示列表里点击过来,URL编码就不确定了。这个和操作系统语言以及浏览器相关。

 

ie默认情况下,对在地址栏里输入的URL路径里的中文是用utf-8编码的,但对get参数不会自动编码,会直接把原始字符串发过去。

其他浏览器都会对地址栏里输入的get参数进行编码,编码方式和操作系统环境语言相关。

 

 

研究了一下几个大的搜索引擎是怎么处理这个问题的。

 

1.百度,搜狗等国内搜索引擎

这些搜索引擎的默认编码都是gb2312的,所以一般用户不会遇到这种问题。但我的系统是linux,系统编码是zh_CN.UTF-8的,就会遇到这种问题。

 

如百度:

gb2312编码:

http://www.baidu.com/s?wd=%D6%D0%B9%FA

utf-8编码

http://www.baidu.com/s?wd=%E4%B8%AD%E5%9B%BD

 

所以国内的搜索引擎基本没处理这个问题。应该认为这样的用户比较少,可以不予考虑吧。

 

2. google.com

google.com默认编码是utf-8,也只接受utf-8编码的地址,否则会出现乱码。google.com面对的是全球用户,不会专门为了中国用户而做特殊处理,可以理解。

gb2312

http://www.google.com/search?q=%D6%D0%B9%FA

utf-8

http://www.google.com/search?q=%E4%B8%AD%E5%9B%BD

 

3.google.cn

google.cn的默认编码也是utf-8。但它针对的是中文用户。而中文用户的大多数操作系统是中文的windows,浏览器的默认编码也一般是gb2312,所以这个问题必须考虑。google.cn能同时兼容两种编码。

gb2312:

http://www.google.cn/search?q=%D6%D0%B9%FA

utf-8:

http://www.google.cn/search?q=%E4%B8%AD%E5%9B%BD

 

google.cn是怎么做到的?

有人说数query里的%号,utf-8的一个汉字是3个字节,所以有三个%,而gb2312的编码的汉字是2个字节,2个%号。但遇到2和3的倍数呢?比方6个字节,是当3个gb2312的汉字处理呢还是2个utf-8的汉字处理呢?

 

 

于是在网上找了一下UTF-8的编码规则:

 

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的用x表示的二进制位,全部用这个符号的unicode码填充。

下表总结了编码规则,字母x表示可用编码的位。

    Unicode符号范围 | UTF-8编码方式
    (十六进制) | (二进制)
    --------------------+---------------------------------------------
   U-00000000 - U-0000007F: 0xxxxxxx  
   U-00000080 - U-000007FF: 110xxxxx 10xxxxxx  
   U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx  
   U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx  
   U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  
   U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

 

 

汉字的unicode符号范围是4e00-9fff(其中9FA6~9FFF还是空码),正好在第三行的范围内,也就是说每个汉字在UTF-8中都会转换为3个字节。其中第一个字节在11100000(0xE0)-11101111(0xEF)范围内,后两个字节在10000000(0x80)-10111111(0xBF)范围内。

 

于是办法产生了:

 

private static boolean isUTF8Query(String q)
	    throws UnsupportedEncodingException {
	byte[] bytes = q.getBytes("ISO-8859-1");
	for (int i = 0; i < bytes.length; i++) {
           //java 中的byte是有符号的,大于127的都为负数。先转换为int型正数再比较。
	    int first = 0x100 + bytes[i];
          //寻找查询关键词中的第一个中文字符的第一个字节
	    if (first < 0xE0 || first > 0xEF) {
		continue;
	    }
	    if (i + 2 < bytes.length) {
		int second = 0x100 + bytes[i + 1];
		int third = 0x100 + bytes[i + 2];
		if (second >= 0x80 && second <= 0xBF && third >= 0x80
			&& third <= 0xBF) {
		    return true;
		}
	    }
	}
	return false;
    }

 

 使用:

 

 

String q= request.getParameter("q");
q = isUTF8Query(q)?new String(q.getBytes("ISO-8859-1"),"UTF-8"):new String(q.getBytes("ISO-8859-1"),"GBK");
	

 

也有人用搜索queryString里的 %E 的个数的方式做这件事情。不过那样一方面不太准确,另一方面ie不会自动把用户在地址栏输入的get查询中的中文URLEncode,那样的情况下服务器端获取的queryString里没有%,

 

服务器端的问题:

 

用这种方式的时候,服务器端不能让服务器自动解码。如果是tocmat的话,在connector上不能设置URIEncoding="UTF-8",否则tomcat用utf-8解码后,再还原为原始字符串的字节比较麻烦。

如果是其他语言,比方php或者python,也不能让apache自动解码。

 

演示地址:

gb2312编码:

http://so.1ting.com/song.do?q=%C1%F5%B5%C2%BB%AA

utf-8编码:

http://so.1ting.com/song.do?q=%E5%88%98%E5%BE%B7%E5%8D%8E

 

地址栏里直接输入中文也可以。

 

 

 

 

 

2
0
分享到:
评论
5 楼 HYbdbc 2012-06-04  
貌似不能判断啊,我做了个测试,UTF-8编码的 还是显示gb2312
4 楼 jolestar 2009-05-12  
卡拉阿风 写道

所以自己加。

用户在浏览器地址栏里直接输入的东西你怎么给加?
3 楼 卡拉阿风 2009-05-11  
所以自己加。
2 楼 jolestar 2009-04-15  
卡拉阿风 写道

base64加密解密怎么样。而且比较美观
好处太多。。。

问题是浏览器不会自动给你加密啊。
1 楼 卡拉阿风 2009-04-14  
base64加密解密怎么样。而且比较美观
好处太多。。。

相关推荐

    URL搜索关键字的编码

    在实际应用中,当我们需要发送带有查询参数的HTTP请求时,比如在搜索引擎中输入关键字进行搜索,这些关键字就需要先进行URL编码。例如,如果关键字是"北京天气",那么在发送请求时,这个关键字会被编码为"%E5%8C%97%...

    探究dataURI中使用SVG正确姿势

    4. **SEO友好**:搜索引擎可以理解并索引嵌入在HTML中的SVG内容。 然而,也需注意一些潜在的问题: 1. **代码膨胀**:如果SVG文件较大,dataURI可能会使HTML文档变大,影响加载性能。 2. **浏览器兼容性**:虽然...

    js gb2312编码

    百度URL编码,是指在使用百度搜索引擎时,如果URL中包含非ASCII字符,比如中文汉字,百度会将其转换为对应的百分号编码(%XX形式,XX为该字符在UTF-8编码下的二进制表示)。在JavaScript中,我们可以使用`encodeURI...

    URL编码转换器(C#源码)

    这个"URL编码转换器"项目是用C#语言编写的,旨在解决URI(统一资源标识符)编码过程中遇到的问题,特别是对于搜索引擎优化(SEO)时的需求。下面我们将深入探讨URL编码的相关知识点。 **URL编码基础** URL编码,也...

    c#各种URL格式转换工具

    URL规范化是确保所有指向同一资源的URL都指向同一个物理地址的过程,这有助于SEO(搜索引擎优化)。工具可能包括处理相对URL、去掉尾部的"/"、处理默认文档等。 10. **URL编码与安全问题**: 了解何时使用`Uri....

    php的urlencode()URL编码函数浅析

    这部分字符在URI编码时不会被转换成百分号编码。 JavaScript中也有一个函数encodeURI(),它用于对URI进行编码。与PHP中的urlencode() 和 rawurlencode() 类似,但encodeURI() 不会对上述提到的特殊字符进行编码。...

    数据URI图像提取器

    - **SEO优化**:搜索引擎可能更倾向于链接到外部资源而非内联数据。 总结来说,`数据URI图像提取器`是提升网页性能和代码可维护性的一个实用工具,尤其适用于那些希望优化HTML代码的开发者。通过理解和应用这个工具...

    袁孝健-06172151-网络安全作业.md1

    因此,对于信息收集,如搜索引擎的使用,不仅需要查找公开的信息,还要了解如何分析和解释这些信息,包括编码的使用和潜在的安全风险。 对于任务中的微软IIS 4.0/5.0的安全漏洞,这是由于Unicode解码问题导致的,...

    渝海URL编码转换工具 v1.1

    搜索引擎和网站的查询接口通常会对查询参数进行URL编码,确保数据能够正确传递到服务器。渝海URL编码转换工具可以方便开发者和用户在测试查询功能时对URL进行编码和解码,提高调试效率。 五、应用场景 1. 数据提交...

    全能主机运行Wordpress实现伪静态和中文URL的方法

    在WordPress中,伪静态和中文URL的实现对于优化网站的用户体验和搜索引擎友好性至关重要。本文将详细介绍如何在全能主机环境下,利用代码和配置文件来达到这个目标。 首先,我们来理解伪静态。伪静态是一种技术,它...

    Elasticsearch笔记

    Elasticsearch 是一个基于 Lucene 的搜索引擎,它提供了一个 RESTful API 来实现数据的索引、搜索和管理。RESTful API 是一种架构风格,设计理念是把每个资源看作是一个网络上的实体,可以通过 URI 来唯一标识和访问...

    PHP 伪静态 网址参数中的【中文正则表达式】问题.rar

    在PHP开发中,伪静态是一种常见的技术,用于将动态网页以静态HTML的形式展现,从而提高网站的SEO(搜索引擎优化)效果。在这个主题中,我们主要关注的是如何处理URL中的中文参数,以及涉及到的中文正则表达式问题。...

    图片在线转Base64编码 v1.0

    3. **SEO不友好**:搜索引擎可能无法正确索引Base64编码的图片内容。 在“image2base64_v1.0.php”文件中,可能包含如下关键步骤: 1. 图片文件读取:使用`file_get_contents()`函数读取图片文件的二进制内容。 2. ...

    Go-一个简单而快速的Go库用于将输入字符串模糊匹配到目标字符串列表

    在实际应用中,这样的模糊匹配库可以被用在各种场景,如搜索引擎的建议功能、自动补全、拼写纠错、推荐系统等。它可以帮助用户在大量文本数据中快速找到与他们输入内容最相关的条目,提高用户体验和效率。在Go语言中...

    整理的用Python编写的爬虫文档.pdf

    爬虫是搜索引擎抓取网页数据的重要手段,也是数据挖掘和信息提取的关键技术之一。 3. 网页地址(URL)和统一资源标识符(URI):文档中多次提到了URL和URI,两者都用于指定互联网上的资源。URI是更通用的概念,包括...

    磁力链资源搜索器

    此外,对于磁力链资源搜索器的优化使用,用户可以尝试设置不同的搜索引擎,以获得更全面的搜索结果。同时,配合高效的BitTorrent客户端,如qBittorrent、uTorrent等,可以进一步提升下载体验。但请注意,P2P下载过程...

    语义网基础教程(中文版)

    语义网的应用广泛,例如在知识图谱、智能搜索引擎、推荐系统、医疗信息共享等领域都有重要作用。通过语义网技术,搜索引擎可以理解查询的深层含义,给出更精准的搜索结果;在医疗领域,医生和研究人员可以跨机构分享...

    使用DNS作为REST Web服务的发现机制1

    4. **限定查找范围**:客户端可以限制搜索范围,例如只查找特定域(如example.org)内的搜索引擎服务。 在RESTful系统中,服务类型的概念对于实现服务发现至关重要。客户端通常需要根据服务的类型和元数据来选择...

Global site tag (gtag.js) - Google Analytics