0%

URL乱码

URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。这是因为网络标准RFC1738做了硬性规定:
1581572958(1)

一、HTML页面(response乱码)

  • 网页中html的编码:HTTP header 、meta、user-agent(浏览器) 权重越来越低,也就是说http头会覆盖meta头信息。
  • 可以在后台设置编码方式:response.setContentType(“text/html; charset=utf-8”);
  • 可以在前端设置编码方式:
    HTML5简化成
    css文件顶部:@charset utf-8
  • 若前两者均没有,浏览器一般有默认编码。
    Content-Type:是Http的实体首部字段,用于说明请求或返回的消息主体是用何种方式编码,在request header和response header里都存在。

浏览器解码html字节流过程:当浏览器请求一个静态html时,服务器会将html页面的字节流通过网络传输给浏览器。浏览器再将字节流解码成相应的html文本字符,从而将html元素渲染出来。

  • 查看页面编码方式(也就是浏览器查看应该用什么方式解码)如下图:
    1582089687(1)

  • 一个html页面可以有多种编码:
    与html页面编码相关的还有js(css)文件编码,默认是采用html的编码格式去解析js(css)文件。如果js(css)文件与html页面编码方式不同,则script标签有一个charset属性来指定编码方式。
    script type=”text/javascript” src=”myscripts.js” charset=”UTF-8”/

二、Web后台编码(request乱码)

  • POST
    html页面是utf-8格式的, 页面编码也指定为utf-8。
    1582092789
      html提交普通表单时,参数以字节流的方式传输到web服务器,web服务器解码字节流得到参数。tomcat默认采用ISO-8859-1编解码,所以直接获取参数是乱码,以ISO-8859-1编码回原本的字节流再用utf-8重新解码就可以得到正确的参数。
      可以在获取任何参数前调用 request.setCharacterEncoding(“utf-8”) ,即可用utf-8解码参数,就不用那么麻烦了。其他语言在原理上也都是相同的。
  • GET方式原理一样,代码比较麻烦,一般在Tomcat中配置
    connectionTimeout=”20000”
    redirectPort=”8443”
    URIEncoding=”UTF-8”

三、哪些字符需要转码

  • ASCII的控制字符
    ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备。例如,12代表换页/新页功能,指示打印机跳到下一页的开头。这些字符是不可打印的,自然需要转化。
  • 一些非ASCII字符
    比如中文,阿拉伯字符等。
  • 一些保留字符
    比如最常见的连接符“&”。(&是看成普通字符还是参数分隔符)
  • 一些不安全的字符
    比如空格,为了防止引起歧义,需要转化成“+”。

字符编码:ASCII Unicode UTF-8