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

3 篇文章 0 订阅
3 篇文章 0 订阅

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值