这里有新鲜出炉的 Java 设计模式, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 java 中的乱码问题汇总相关资料, 并附解决方案, 出现乱码问题有编码与解码, 字节流与字符流出现乱码, 等其他情况, 需要的朋友可以参考下
java 中的乱码问题
最近做项目经常会遇到 Java 中的乱码问题, 于是就抽时间整理下出现乱码问题的情况和如何处理, 这里做了一个整理,
分析
编码与解码
编码就是将字符转为字节, 解码就是就是将字节转换为字符
字节流与字符流
对文件的读写操作都是通过字节流来实现的, 即使 JAVA 中有字符流, 但是其底层仍然使用的字节流
乱码问题出现
java 中使用最频繁的是字符, 当我们将文件读入内存并在控制台显示时 (字节流 ---> 字符流), 就需要用到解码如果文件是 UTF-8 编码, 而我们解码时错用成 GBK(如果不指定编码, JAVA 会采取系统默认编码)来解码, 那么只能显示乱码而我们写文件时, 最好指定编码(UTF-8)
解决方案
示例 1
将字节流转换为字符流时, 我们指定编码格式这是我们文件也应该是 gb2312 编码
- public static String read(String filename) throws Exception {
- InputStream is = new FileInputStream(filename);
- BufferedReader in = new BufferedReader(new InputStreamReader(is,
- "gb2312")); // 指定编码格式
- String s;
- StringBuilder sb = new StringBuilder();
- while ((s = in.readLine()) != null) {
- sb.append(s + "\n");
- }
- in.close();
- return sb.toString();
- }
示例 2
直接通过字节流读入, 使用 String 转换为字符时, 指定编码
- package com.dy.xidian;
- import java.io.FileInputStream;
- import java.io.InputStream;
- class BufferedInputFile {
- public static String read(String filename) throws Exception {
- @SuppressWarnings("resource")
- InputStream is = new FileInputStream(filename);
- byte[] b = new byte[1024];
- is.read(b);
- return new String(b, "gb2312");
- }
- }
- public class MemoryInput {
- public static void main(String[] args) throws Exception {
- String filename = "E:/html/gb2312.php";
- String s = BufferedInputFile.read(filename);
- System.out.println(s);
- }
- }
陷阱
I/O 操作中有个 FileReader 类, 这个类隐藏了字节流转为字符流的细节, 我们可以这样使用 BufferedReader in = new BufferedReader(new FileReader(filename)); 这样, 我们直接得到就是字符流了但我们发现, 我们并没有去设置编码, 这是因为 FileReader 中采用了默认编码方式这就变得很危险了, 如果其默认的编码格式和我们文件的编码不同, 那么读出来的数据一定是乱码所以我们最好采用示例中的方式来进行流的转换
来源: http://www.phperz.com/article/18/0208/359506.html