java IO流、DB数据库、Web乱码问题及解决办法总结
来源:互联网 发布:matlab绘制矩阵点图 编辑:程序博客网 时间:2024/06/06 18:34
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");方法进行设置
- java IO流、DB数据库、Web乱码问题及解决办法总结
- java项目 java web项目数据库乱码问题的解决办法
- Java中文乱码问题分析及解决办法
- Java Web 中文乱码问题总结
- Java Web中乱码问题的总结
- web项目中的乱码问题的原因及解决办法
- Servlet及数据库乱码问题(java)
- java io流读文件,乱码问题
- java web 乱码总结
- 数据库乱码问题的解决办法
- java io读取文件乱码解决办法
- java web 乱码问题
- java web乱码问题
- java web 乱码 问题
- java web 乱码 问题
- Java Web乱码问题
- java web 乱码问题
- mysql数据库中文乱码问题总结及解决手段
- java变量和类型转换
- CRC循环冗余校验之再认识
- LVS集群调度算法
- case when then else end 的使用
- 字符串的基本操作--基于堆分配存储
- java IO流、DB数据库、Web乱码问题及解决办法总结
- C++第三次实验-数组求和
- Writeup for 0CTF2017 web
- linux设备驱动之:1 总线、设备和驱动
- 1033. 旧键盘打字(20) python 篇
- MLlib学习之java实现SVD
- 蛇形填数
- CCF201703-2 学生排队(100分)
- 缓存并发