最近在看Java web中中文编码问题,特此记录下。

  本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法:

一、常见编码方式:

    1、ASCII 码

       众所周知,这是最简单的编码。它总共可以表示128个字符,0~31是控制字符如换行、回车、删

    除等,32~126是打印字符,可以通过键盘输入并且能够显示出来的。

    2、ISO-8859-1

      它是基于ASCII码基础上扩展的,它总共能表示256个字符,涵盖了大多数西欧语言字符。详见

    ISO-8859-1 编码    该编码不支持中文,举个中文编码栗子:

    字符串“I am 君山”用 ISO-8859-1 编码,下面是编码结果:

    

    由于ISO-8859-1 是单字节编码且不支持中文,直接将中文字符转成‘3f’, 3f也就是常见的"?"字符

    3、GB2312

      它是双字节编码,共包含6763个汉字。

    4、GBK

      汉字内码扩展规范,是基于GB2312上拓展的,加入了更多的汉字,能表示21003个汉字。它的编码

    是和GB2312兼容的。也就是说用GB2312编码的汉字可以用GBK来解码,并且不会乱码。倒过来就不完

    全可以了,因为GB2312描述的汉字比GBK少。

    5、UTF-16

      UTF-16是基于Unicode上定义的, 用两个字节来表示Unicode的转换格式,它采用定长的表示方法,

    即不能什么字符都可以用两个字节表示。两个字节是16个bit,所以就做UTF-16。(Unicode 囊括了世界

    上所有语言,所有语言均可通过Unicode来相互翻译,详解Unicode 编码

    6、UTF-8

      由于UTF-16统一采用两个字节来表示一个字符, 有很多字符用一个字节表示即可。所以存储空间放

    大了一倍,还会增加网络传输的流量,所以推出了UTF-8。 UTF-8采用了一种变长技术,每个编码区域有

    不同的字码长度。

    通过上面介绍和对比,对于中文字符的处理我想UTF-8是最理想的中文编码。

二、常见乱码问题分析

    1、中文变成看不懂的字符

      如果一串中文字符变成了一串看不懂的字符如:"Ì Ô £ ¡Î Ò Ï²»¶ £ ¡",这种情况通常是编码

    字符集与解码时所用的字符集不一致所造成的。比如使用GBK编码,如果使用ISO-8859-1解码

    的话结果就是这样。

    2、一个汉字变成了一个问号

      如果编码和解码的字符集都是一致的,那么可以确定该字符编码不支持中文,例如:ISO-8859-1

    3、一个汉字变成了两个问号

      中文经过多次编码且其中有一次编码或者解码使用了不支持中文的字符集 

三、常见案例分析(tomct+google)

    1、参数传输乱码

      背景:从jsp中传参数(包括中文)请求后台数据,在后台获取到的请求参数乱码。

      1.1 前端编码设置,先讲解下jsp中编码的配置:

        a、其中contentType中charset用来设置服务器发送给客户端时的内容编码;pageEncoding 用

      来设置JSP源文件本身和响应正文中的字符编码。通俗的说pageEncoding是jsp文件本身的编码,如果

      pageEncoding设置为ISO-8859-1,则jsp页面中不能保存中文字符,会自动提示你是否要设置为UTF-8.

        b、jsp文件编码字符集默认为ISO-8859-1, JSP源文件字符集时,优先级为pageEncoding>

      contentType。如果都没有设置,默认ISO-8859-1。

        c、设置响应输出的字符集时,优先级为contentType>pageEncoding。如果都没有设置,默认

      ISO-8859-1。

           <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

      综上所述,解决该问题乱码的第一步要设置jsp中的编码,最好统一为UTF-8。

      exmaple(乱码示例):

      

      页面效果如下:

       

      1.2 后端编码设置

        a、首先要设置tomcat编码,其中要了解两个参数(conf/server.xml):URIEncoding 和

        useBodyEncodingForURI,可以查看官方文档说明:

        http://tomcat.apache.org/tomcat-7.0-doc/config/http.html, 以下是我理解:

          1)URIEncoding是对所有GET方式的请求的数据进行统一的重新编码,默认编码为

         ISO-8859-1(针对URI上的请求参数)

          2)useBodyEncodingForURI:此设置仅适用于请求的查询字符串(针对请求体中内容)。

         与URIEncoding不同,它不影响请求URI的路径部分。如果不知道请求字符编码(浏览器不提供,

        并且SetCharacterEncodingFilter不设置或使用Request.setCharacterEncoding方法的类

        似过滤器),默认编码始终为“ISO-8859-1”。URIEncoding设置对此默认值没有影响。

        该参数为false。通俗的说:

        true表示get和post的编码保持一致,post方式的编码是什么,get方式的编码就是什么。

        false表示get和post的字符编码各自设置,互相没有关系。

        example1(只设置URIEncoding):  

        server.xml

      <Connector connectionTimeout="20000" port="9080" protocol="HTTP/1.1"  
        redirectPort="443" URIEncoding="UTF-8" />

        controller:

        @RequestMapping(value = "/testURI", method=RequestMethod.POST)
    @ResponseBody
    public String testURI(HttpServletRequest request){
    String username = request.getParameter("username");
    String nickname = request.getParameter("nickname");
    System.out.println("姓名:" + username + ", 昵称:" + nickname);
     return "姓名:" + username + ", 性别:" + nickname;
    }

        jsp:

      <form action="${pageContext.request.contextPath }/testURI.html?username=张三" method="post">
  <input type="text" name="nickname" value="老张三"/>
  <input type="submit" value="提交"/>
  </form>

        输出结果:     姓名:张三, 昵称:è€å¼ ä¸

        从结果中可以看出, URIEncoding只对URI中的参数进行编码。  

      example2:只修改controller中代码,就都会显示正常

      @RequestMapping(value = "/testURI", method=RequestMethod.POST)
  @ResponseBody
  public String testURI(HttpServletRequest request) throws UnsupportedEncodingException{
  request.setCharacterEncoding("UTF-8");
  String username = request.getParameter("username");
   String nickname = request.getParameter("nickname");
  System.out.println("姓名:" + username + ", 昵称:" + nickname);
  return "姓名:" + username + ", 性别:" + nickname;
  }

    其实第二种做法并不是很方便,一般通过设置URIEncoding+encodingFilter即可解决。

    example3(通常做法):

    web.xml代码如下,其余跟example1一样即可。

  <filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

    example4:

      @RequestMapping(value = "/testURI", method=RequestMethod.POST)
  @ResponseBody
  public String testURI(HttpServletRequest request) throws UnsupportedEncodingException{
  request.setCharacterEncoding("UTF-8");
  String username = request.getParameter("username");
   String nickname = request.getParameter("nickname");
  System.out.println("姓名:" + username + ", 昵称:" + nickname);
  return "姓名:" + username + ", 性别:" + nickname;
  }

    如果只设置URIEncoding=ISO-8859-1,request.setCharacterEncoding("UTF-8");只会

    对请求体中的参数进行编码,所以username是乱码的。

    

    example5: 在example4的基础上设置useBodyEncodingForURI="true"

    设置useBodyEncodingForURI=true时,就会将请求参数和请求体中的参数根据

    request.setCharacterEncoding或者contentType中的字符集编码。

    

本文先记录至此,参考文献有《深入分析Java web解析》《tomcat docs》

      

        

Java web中常见编码乱码问题(一)的更多相关文章

  1. Java web中常见编码乱码问题(二)

    根据上篇记录Java web中常见编码乱码问题(一), 接着记录乱码案例: 案例分析:   2.输出流写入内容或者输入流读取内容时乱码(内容中有中文) 原因分析: a. 如果是按字节写入或读取时乱码, ...

  2. JAVA WEB 中的编码分析

    JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...

  3. 深入分析Java Web中的编码问题

    编码问题一直困扰着我,每次遇到乱码或者编码问题,网上一查,问题解决了,但是实际的原理并没有搞懂,每次遇到,都是什么头疼. 决定彻彻底底的一次性解决编码问题. 1.为什么要编码 计算机的基本单元是字节, ...

  4. Java Web中的编码解析

    在springmvc工程web.xml中配置中文编码 <!-- 配置请求过滤器,编码格式设为UTF-8,避免中文乱码--> <filter> <filter-name&g ...

  5. 【中文乱码】深入分析 Java Web 中的中文编码问题

    深入分析 Java Web 中的中文编码问题 1.几种常见的编码格式 1.1 为什么要编码 在计算机中存储信息的最小单元是 1 个字节,即 8 个 bit, 所以能表示的字符范围是 0 ~ 255 个 ...

  6. Java Web中解决乱码的方式

    Java Web中解决乱码的方式 方式一:添加编码过滤器 package com.itmacy.dev.filter; import javax.servlet.*; import javax.ser ...

  7. 解决java web中safari浏览器下载后文件中文乱码问题

    解决java web中safari浏览器下载后文件中文乱码问题 String fileName = "测试文件.doc"; String userAgent = request.g ...

  8. 深入分析Java Web中的中文编码问题

    要对Java Web项目进行编码原因: 1.在计算机中存储信息的最小单位是1个字节,即8个bit,所以能表示的字符范围是0~255个. 2.电脑需要表示的符号太多.无法用1个字节完全表示. 要解决这个 ...

  9. 第三章 深入分析Java Web中的中文编码问题

    3.1 几种常见的编码格式 3.1.1 为什么要编码 一个字节 byte只能表示0~255个符号,要表示更多的字符,需要编码. 3.1.2 如何翻译 ASCII码:有128个,用一个字节的低7位表示. ...

随机推荐

  1. 卷积神经网络CNN与深度学习常用框架的介绍与使用

    一.神经网络为什么比传统的分类器好 1.传统的分类器有 LR(逻辑斯特回归) 或者 linear SVM ,多用来做线性分割,假如所有的样本可以看做一个个点,如下图,有蓝色的点和绿色的点,传统的分类器 ...

  2. zepto.js介绍

    是一个阉割版的jQuery zepto不支持jQuery过于复杂的选择器,比如:first :last :eq zepto如果要用动画必须再次引包 zepto能将css3中transition支持的动 ...

  3. Dubbo的使用简介

    Dubbo是什么 官方定义 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000, ...

  4. 使用RandomAccessFile在两个java进程之间传递数据

    大部分情况下,我们面对在两个java进程只见传递数据的问题时,第一个想到的就是开server,然后通过socket收发消息.这方面有大量的框架可用,就不细说了.但如果两个进程是在一台机器上,那么还可以 ...

  5. C语言学习第五章

    今天要进行一个重要元素数组的学习了.这一章要掌握什么是数组,数组怎么样命名,数组怎么样使用,以及一些常见的错误和需要注意的事项. 一.      数组的基本概念 数组是可以在内存中连续存储多个元素的结 ...

  6. JAVA 继承中的this和super

    学习java时看了不少尚学堂马士兵的视频,还是挺喜欢马士兵的讲课步骤的,二话不说,先做实例,看到的结果才是最实际的,理论神马的全是浮云.只有在实际操作过程中体会理论,在实际操作过程中升华理论才是最关键 ...

  7. salesforce零基础学习(七十一)级联表DML操作

    曾经做项目没有考虑那么多,对于级联表操作都是正常的一步一步操作,没有考虑过失败情况,最近项目遇见了失败的情况,导致碰到了相应的情况,特此mark一下,免得后期继续踩坑. 需求如下:新建页面,页面中包含 ...

  8. springmvc 方法参数自定义的解析

    1.实现HandlerMethodArgumentResolver接口: 2.在配置文件中添加配置<mvc:argument-resolvers>   <bean class=&qu ...

  9. oracle AWR性能监控报告生成方法

    目前相当一部分公司会用到oracle,在做性能测试的时候,对数据库的监控很重要,那么这里先介绍下如何生成oracle自带的awr监控报告,而具体报告的内容分析会放在后续的博客中 oracle性能分析入 ...

  10. openresty源码剖析——lua代码的执行

    上一篇文章中我们讨论了openresty是如何加载lua代码的 那么加载完成之后的lua代码又是如何执行的呢 ##代码的执行  在init_by_lua等阶段  openresty是在主协程中通过lu ...