IO\DB\Web乱码问题总结
乱码出现的原因:编码使用的字符集与解码所用的字符集不一致导致的;
1、数据库乱码
server本身设定问题,例如还停留在latin1
table的语系设定问题(包含character与collation)
客户端程式(例如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");方法进行设置