zoukankan      html  css  js  c++  java
  • Java中常见编码格式及乱码解决方法

    一:设置编码格式

      1、JSP文件

        charset=UTF-8 的作用是指定JSP向客户端输出的编码方式为"UTF-8",pageEncoding="UTF-8" 为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效,request.setCharacterEncoding("UTF-8") 则是对请求进行了中文编码。

    1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>    
    2 <%   request.setCharacterEncoding("UTF-8");  %>  

      2、XML文件

    <?xml version="1.0" encoding="UTF-8"?> 

      3、HTML文件(也称HTTP BODY)

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

      4、Tomcat

        通常在配置文件server.xml文件中更改编码格式。默认编码为ISO-8859-1 。URIEncoding设置编码格式,useBodyEncodingForURI=true 则是使用Header 中 ContentType 中定义的编码格式

    <Connector port="8080" useBodyEncodingForURI="true" URIEncoding="UTF-8" /> 

      5、访问数据库都是通过客户端 JDBC 驱动来完成,用 JDBC 来存取数据要和数据的内置编码保持一致,可以通过设置 JDBC URL

    MySQL:url="jdbc:mysql://localhost:3306/DB?useUnicode=true&characterEncoding=UTF-8"

    二:经常涉及到编码操作的

      1、I/O

        涉及到编码的地方一般都在字符到字节或者字节到字符的转换上,而需要这种转换的场景主要是在 I/O 的时候,这个 I/O 包括磁盘 I/O 和网络 I/O,关于网络 I/O 部分在后面将主要以 Web 应用为例介绍。下图是 Java 中处理 I/O 问题的接口:

        

        Reader 类是 Java 的 I/O 中读字符的父类,而 InputStream 类是读字节的父类,InputStreamReader 类就是关联字节到字符的桥梁,它负责在 I/O 过程中处理读取字节到字符的转换,而具体字节到字符的解码实现它由 StreamDecoder 去实现,在 StreamDecoder 解码过程中必须由用户指定 Charset 编码格式。值得注意的是如果你没有指定 Charset,将使用本地环境中的默认字符集,例如在中文环境中将使用 GBK 编码。

        写的情况也是类似,字符的父类是 Writer,字节的父类是 OutputStream,通过 OutputStreamWriter 转换字符到字节。如下图所示:

        同样 StreamEncoder 类负责将字符编码成字节,编码格式和默认编码规则与解码是一致的。

        编码示例:

     1 String file = "c:/stream.txt"; 
     2  String charset = "UTF-8"; 
     3  // 写字符换转成字节流
     4  FileOutputStream outputStream = new FileOutputStream(file); 
     5  OutputStreamWriter writer = new OutputStreamWriter(outputStream, charset); 
     6  try { 
     7     writer.write("这是要保存的中文字符"); 
     8  } finally { 
     9     writer.close(); 
    10  } 
    11  // 读取字节转换成字符
    12  FileInputStream inputStream = new FileInputStream(file); 
    13  InputStreamReader reader = new InputStreamReader(inputStream, charset); 
    14  StringBuffer buffer = new StringBuffer(); 
    15  char[] buf = new char[64]; 
    16  int count = 0; 
    17  try { 
    18     while ((count = reader.read(buf)) != -1) { 
    19         buffer.append(buffer, 0, count); 
    20     } 
    21  } finally { 
    22     reader.close(); 
    23  }

      2、内存中操作

        在 Java 开发中除了 I/O 涉及到编码外,最常用的应该就是在内存中进行字符到字节的数据类型的转换,Java 中用 String 表示字符串,所以 String 类就提供转换到字节的方法,也支持将字节转换为字符串的构造函数。如下代码示例:

    1     String s = "这是一段中文字符串"; 
    2     byte[] byte = s.getBytes("ISO-8859-1"); 
    3     String str = new String(byte,"UTF-8"); 

        Charset 提供 encode 与 decode 分别对应 char[] 到 byte[] 的编码和 byte[] 到 char[] 的解码。编码与解码都在一个类中完成,通过 forName 设置编解码字符集,这样更容易统一编码格式。如下代码所示:

    1     Charset charset = Charset.forName("UTF-8"); 
    2     ByteBuffer byteBuffer = charset.encode(string); 
    3     CharBuffer charBuffer = charset.decode(byteBuffer); 

        Java 中还有一个 ByteBuffer 类,它提供一种 char 和 byte 之间的软转换,它们之间转换不需要编码与解码,只是把一个 16bit 的 char 格式,拆分成为 2 个 8bit 的 byte 表示,它们的实际值并没有被修改,仅仅是数据的类型做了转换。如下代码所以:

    1     ByteBuffer heapByteBuffer = ByteBuffer.allocate(1024); 
    2     ByteBuffer byteBuffer = heapByteBuffer.putChar(c);

      3、Java Web

        方法一:有web.xml的话,在xml中添加如下代码:

     1      <!-- 统一字符编码 -->
     2       <filter>
     3         <filter-name>CharacterEncodingFilter</filter-name>
     4         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
     5         <init-param>
     6             <param-name>encoding</param-name>
     7             <param-value>utf-8</param-value>
     8         </init-param>
     9         <init-param>  
    10             <param-name>forceEncoding</param-name>  
    11             <param-value>true</param-value>  
    12         </init-param>  
    13       </filter>
    14 
    15       <filter-mapping>  
    16          <filter-name>CharacterEncodingFilter</filter-name>  
    17          <url-pattern>/*</url-pattern>  
    18        </filter-mapping>  

        方法二:

          1)接收参数

            通常使用request.setCharacterEncoding设置接收参数的编码格式

    request.setCharacterEncoding("UTF-8")

            如上述接收参数出现乱码,可通过String进行编码转换。这个也是常用的解决乱码方法

    String value = new String(request.getParameter(name).getBytes("ISO-8859-1"), "UTF-8"); 

          2)返回参数
            只能用来设置out输出流中所采用的编码。优先级最高

    response.setCharacterEncoding("UTF-8"); 

            既可以设置out输出流中字符的编码方式,也可设置浏览器接收到这些字符后以什么编码方式来解码。等价于<%@ page contentType="text/html;charset=UTF-8" %>。优先级其次

    response.setContentType("text/html;charset=UTF-8"); 

            只能用来设置out输出流中字符的编码方式。优先级最低

    response.setLocale(new java.util.Locale("ZH","CN"));

      参考:

        http://www.cnblogs.com/gdayq/p/5817367.html

  • 相关阅读:
    Android开发之JSON数据发送与获取
    Layouts之TableLayout表格布局
    Layouts之GridLayout网格布局
    Android WiFi模块学习
    关于Fragment的讲解及适配
    hive 压缩全解读(hive表存储格式以及外部表直接加载压缩格式数据);HADOOP存储数据压缩方案对比(LZO,gz,ORC)
    Dynamics CRM SQL转化为FetchXML的在线转化工具
    Dynamics CRM 通过Odata创建及更新记录各类型字段的赋值方式
    shell命令执行hive脚本(hive交互,hive的shell编程)
    CRM 2013 Script Loading Deep Dive
  • 原文地址:https://www.cnblogs.com/JealousGirl/p/SolveGarbled.html
Copyright © 2011-2022 走看看