Http请求时URL中的中文编码

Posted 北极丶光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Http请求时URL中的中文编码相关的知识,希望对你有一定的参考价值。

Http请求时,URL中作为参数值的中文字符等会被编码

  1、处理编码思路:

        注意:[在浏览器上访问时,每个空格会被转码为 %20 ,URLencode会将每个空格转码为 + ]

            URLEncode的转码会将一些不需要转码的字符也进行转码(例如不是参数值的& : /等)

        1.于需要的参数先进行编码。(如果是get请求可以先使用URLEncode编码后进行URL的拼接)  

        2.对URL进行截取,然后统一编码,将特殊字符编码后替换回来(路径中的&   /  : 当其作为参数值的时候需要转码,否

          则不能被转码);此方法弊端:当& 和 /  作为参数值时需要被转码,不好处理。

   2、一些常见字符被URLEncode转码后的值(中文字符会被转码为  以%E开头,长度为9的字符串)

       英文  编码后  : %3F
               /  编码后:%2F
              % 编码后:%25
      中文 编码后:%EF%BC%9F
      单个空格   编码后:+ (在浏览器上访问时,每个空格会被转码为 %20 ,URLencode会将

              每个空格转码为 +;可以转码后将其中的  +  用  %20替换掉 )       

        + 编码后:%2B
      英文 编码后:%3A
      中文 : 编码后:%EF%BC%9A
             & 编码后:%26

 3、简单的拼接demo(存在不足之处)

      

      public static void main(String[] args) {
		//被转码后的url
		String result = "";
		//需要转码的url
		String url = "https://www.baidu.com/s?wd=语 文 ?&rsv_spt=1"
				+ "&rsv_iqid=0xd13fd9040001fb1d&issp=1&f=8&rsv_bp=0"
				+ "&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=2"
				+ "&rsv_sug1=2&rsv_sug7=101&rsv_sug2=0&inputT=774&rsv_sug4=1367  &AAAA=1";
		int index = url.indexOf("?");
		result = url.substring(0,index+1);
		String temp = url.substring(index+1);
		try {
			//URLEncode转码会将& : / = 等一些特殊字符转码,(但是这个字符  只有在作为参数值  时需要转码;例如url中的&具有参数连接的作用,此时就不能被转码)
			String encode = URLEncoder.encode(temp, "utf-8");
			System.out.println(encode);
			encode = encode.replace("%3D",  "=");
			encode = encode.replace("%2F", "/");
			encode = encode.replace("+", "%20");
			encode = encode.replace("%26", "&");
			result += encode;
			System.out.println("转码后的url:"+result);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
	}

  编码前地址:http://hi.baidu.com/test/?a=张三&b=_a123&c=+abc

  编码后地址:http://hi.baidu.com/test/?a=%E5%BC%A0%E4%B8%89&b=_a123&c=+abc  (中文字符已被转码)

  字符对应的值:

    /  →  47  a-z →  97~122  A-Z  →  65~90  :  →  58  %  → 37 

  中文字符对应的值是大于255的 

  char c = \'我\';

  System.out.println((int)c)   / /可以查看对应的数值 

 
在字符编码方面,ASCII码为标准符号、数字、英文等进行了保留,取值范围是0~127,还有一部分作为扩展ASCII码128~255

当操作系统采用非ASCII编码时(比如汉字编码),一般用扩展ASCII码来进行,约定用128~255范围的编码连续2~3甚至4个来进

行汉字编码,(比如国标用连续两个128~255的编码表示1个汉字,分别是区码和位码的编码;UTF-8可以用3个连续的数来表示一

个汉字),具体编码规则要看具体定义,一般不相同的。因此,在处理字符串时,如果是有符号字符串,遇到小于0的字符,会结合

后面紧跟的字符来组成一个汉字,大于0的为标准西文字符;如果是无符号的,则可以判断是否大于127。


以上是关于Http请求时URL中的中文编码的主要内容,如果未能解决你的问题,请参考以下文章

为啥 System.Net.Http HttpClient 对我的请求 URL 进行编码?

简单的 Javascript http 请求片段但不起作用

ssrf漏洞中的url编码解码

ssrf漏洞中的url编码解码

Http请求url参数字符集

协议分析HTTP响应头中的2种编码方式介绍