java IO流、DB数据库、Web乱码问题及解决办法总结

来源:互联网 发布:matlab绘制矩阵点图 编辑:程序博客网 时间:2024/06/06 18:34

IO\DB\Web乱码问题总结

乱码出现的原因:编码使用的字符集与解码所用的字符集不一致导致的;

1、数据库乱码

server本身设定问题,例如还停留在latin1

table的语系设定问题(包含charactercollation)

客户端程式(例如php)的连线语系设定问题

a) 创建数据库和表时出现乱码问题

MySQL的默认编码是Latin1,不支持中文,需要把数据库的默认编码修改为gbk或者utf-8。防止在向数据库中导入中文时出现乱码问题;

i. 实例:

创建数据库时:

CREATE DATABASE 'hospital'  CHARACTER SET 'utf8'  COLLATE 'utf8_general_ci';  
创建表时:

CREATE TABLE'database_user' (  'ID' varchar(40) NOT NULL default '',  'UserID'varchar(40) NOT NULL default '',  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看数据库默认编码

>show variables like 'character%';+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | latin1 || character_set_connection | latin1 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | latin1 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/share/mysql/charsets/ |+--------------------------+----------------------------+
看看修改后的编码

mysql> show variables like 'character%';+--------------------------+-------------------------------------------------+| Variable_name            | Value                                           |+--------------------------+-------------------------------------------------+| character_set_client     | utf8                                            || character_set_connection | utf8                                            || character_set_database   | utf8                                            || character_set_filesystem | binary                                          || character_set_results    | utf8                                            || character_set_server     | utf8                                            || character_set_system     | utf8                                            || character_sets_dir       | D:\DB\Mysql\mysql-5.7.11-winx64\share\charsets\ |+--------------------------+-------------------------------------------------+

注释:

character_set_client为客户端编码方式;

character_set_connection为建立连接使用的编码;

character_set_database数据库的编码;

character_set_results结果集的编码;

character_set_server数据库服务器的编码;

只要保证以上四个采用的编码方式一样,就不会出现乱码问题。

查看数据库编码的命令:show variables like 'character%';/show variables like 'collation%';

b) 导入数据时的中文乱码问题

i. 实例:

设置数据的格式为UTF-8,与数据库及表的格式保持一致;

设置数据库:

ALTER DATABASE `hospital` DEFAULT CHARACTER SET utf-8 COLLATE utf-8_general_ci; 
设置表:

ALTER TABLE `t_patient` DEFAULT CHARACTER SET utf-8 COLLATE utf-8_general_ci;  

导入数据:

LOAD DATA LOCAL INFILE 'D:/hospital.txt' INTO TABLE t_patient;  

2、IO流乱码

//查看默认编码集Charset.defaultCharset();

a) IO流读取文件时的乱码问题:在未知文件编码的情况下,未经编码集设置直接进行文件的读取,会遇到乱码问题。

i. 实例:事例中file.txt文件的编码为“UTF-8”,而程序默认的编码为“GBK”

import java.io.BufferedReader;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;public class CharsetDome {public static void main(String[] args) {    String str = "";    String line = "";    FileInputStream fis = null;    InputStreamReader isr = null;    BufferedReader br = null;    try {         fis = new FileInputStream("D:/file.txt");        isr = new InputStreamReader(fis);        br = new BufferedReader(isr);        while ((line = br.readLine()) != null) {           str = str + line;        }    } catch (Exception e) {        e.printStackTrace();    } finally {        try {            fis.close();        } catch (Exception e) {            e.printStackTrace();        }    }System.out.println(str);}}

执行结果出现编码错误:

D:/file.txt的内容为:浣犲ソ锛屼腑鍥斤紒

ii. 解决办法:使用InputStream转换流设置字符集

 fis = new FileInputStream("D:/file.txt");isr = new InputStreamReader(fis,"UTF-8");
执行结果为:

D:/file.txt的内容为:你好,中国!

b) 使用转换流解决文件的读取、写入和copy乱码问题

I. 读取

fis = new FileInputStream("D:/file.txt"); isr = new InputStreamReader(fis,"UTF-8");

Ii. 写入

 fis = new FileOutputStream("D:/file2.txt");isr = new OutputStreamWriter(fis, "UTF-8");

Iii. copy:遵守读取、写入的字符集保持一致统一;

import java.io.File;  import java.io.FileInputStream;  import java.io.FileOutputStream;  import java.io.InputStream;  import java.io.OutputStream;  /*  * 实现思路:  * 1、构建源文件与目标文件  * 2、源文件创建输入流,目标文件创建输出流  * 3、创建字节数组  * 4、使用循环,源文件读取一部分内容,目标文件写入一部分内容,直到写完所有内容  * 5、关闭源文件输入流,目标文件输出流  */  public class FileCopy {      public static void main(String[] args) {          InputStream in = null;          OutputStream out = null;          try {              in = new FileInputStream("D:/file.txt");              // 目标文件创建输出流              out = new FileOutputStream("D:/file2.txt", true);              // 创建字节数组              byte[] temp = new byte[1024];              int length = 0;              // 源文件读取一部分内容              while ((length = in.read(temp)) != -1) {                  // 目标文件写入一部分内容                  out.write(temp, 0, length);              }          } catch (Exception e) {              e.printStackTrace();          } finally {              try {                  // 关闭文件输入输出流                  in.close();                  out.close();              } catch (Exception e) {                  e.printStackTrace();              }          }      }  }

3、Web乱码

a) 使用字符串String解决乱码问题

b) Request请求乱码问题

i. Post:使用request.setCharacterEncoding("utf-8");

ii. Get:在Tomcat中的servlet.xml文件中的Connector中进行配置,注意每个标  签下都要设置;

 <Connector port="4530" protocol="HTTP/1.1"               connectionTimeout="20000"               redirectPort="8443" URLEncoding=UTF-8/>

c) Response回应乱码问题

I. response.setContentType("text/html;UTF-8");方法进行设置

0 0