zoukankan      html  css  js  c++  java
  • 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。

    
    
    人生没有彩排,每天都是现场直播!
  • 相关阅读:
    uniq命令
    全局滚动条样式美化
    感受一下Java乱码出现就知道怎么解决Java乱码了
    用于注解解析的工具类
    迅为i.MX8MM开发板资料更新啦!Linux安卓9.0工业核心板
    迅为-IMX6Q开发板Buildroot文件系统nfs测试
    进步一点点丨迅为4412开发板Linux内核开发基础
    迅为RK3399开发板运行第一个Android程序
    每天学习一点丨借助U盘或TF卡拷贝程序到迅为IMX6ULL开发板上(二)
    资料完整丨i.MX6Q开发板ARM恩智浦工业级linux安卓系统迅为iMX6Q/DL Plus板
  • 原文地址:https://www.cnblogs.com/northern-light/p/8012619.html
Copyright © 2011-2022 走看看