在JVM内部,所有的字符都是用Unicode编码的。而对于JVM所在操作系统的文件系统,可能有不同的编码类型。 
由于JVM和OS文件系统所使用的编码方式不同,JVM在与操作系统进行数据交互的时候,就会进行编码转换。因此可以说,所有的乱码问题一定是JVM和OS文件系统进行数据交互时候出了问题。

  1. import java.io.*;
  2. public class Demo{
  3. public static void main(String [] args) throws Exception {
  4. File file=new File("D:\\test.txt");//mark1
  5. FileInputStream fis=new FileInputStream(file);
  6. InputStreamReader isr=new InputStreamReader(fis,"GB2312");//mark2
  7. File toFile=new File("D:\\toTest.txt");
  8. FileOutputStream fos=new FileOutputStream(toFile);
  9. OutputStreamWriter osr=new OutputStreamWriter(fos);
  10. int content=-1;
  11. while((content=isr.read())!=-1){
  12. osr.write(content);
  13. }
  14. isr.close();osr.close();
  15. fis.close();fos.close();
  16. System.out.println(System.getProperty("file.encoding"));//笔者的系统默认编码是UTF-8
  17. }
  18. }

对于上面的代码,功能是将test.txt文件的内容读取出来,复制一份到toTest.txt中。 
首先JVM需要将数据从OS文件系统读取到JVM内部,这个时候,JVM需要进行编码转换,目标编码当然是Unicode,原编码是啥?当不在mark2行的代码中指定的话,JVM会默认源编码是系统默认类型(在例子中就是UTF-8),上面的代码中我们指定了原编码方式是GB2312(因为GB2312是test.txt文件的编码类型)。因此,如果我们不指定编码格式为GB2312的话,这个过程读入的数据就已经乱码了。

接着我们来看输出,当数据从JVM输出到OS文件系统的时候,也会进行编码转换,此时源编码是Unicode,目的编码是?如果不指定的话,JVM会指定为系统默认编码,这里是UTF-8。

从上面的过程,我们就可以理解Java程序中的乱码了。解决乱码也很简单,就是在JVM和OS文件系统进行数据交互的时候,一定要指定好编码方式。

JVM-java字符编码的更多相关文章

  1. Java 字符编码归纳总结

    String newStr = new String(oldStr.getBytes(), "UTF-8");       java中的String类是按照unicode进行编码的 ...

  2. 【字符编码】Java字符编码详细解答及问题探讨

    一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...

  3. 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  4. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  5. 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础

    这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...

  6. Java 字符编码(二)Java 中的编解码

    Java 字符编码(二)Java 中的编解码 java.nio.charset 包中提供了一套处理字符编码的工具类,主要有 Charset.CharsetDecoder.CharsetEncoder. ...

  7. Java 字符编码(三)Reader 中的编解码

    Java 字符编码(三)Reader 中的编解码 我们知道 BufferedReader 可以将字节流转化为字符流,那它是如何编解码的呢? try (BufferedReader reader = n ...

  8. Java 字符编码(一)Unicode 字符编码

    Java 字符编码(一)Unicode 字符编码 Unicode(http://www.unicode.org/versions/#TUS_Latest_Version) 是一个编码方案,说白了希望给 ...

  9. java字符编码详解

    引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国 ...

  10. JAVA字符编码三:Java应用中的编码问题

    第三篇:JAVA字符编码系列三:Java应用中的编码问题 这部分采用重用机制,引用一篇文章来完整本部分目标. 来源:  Eceel东西在线 问题研究--字符集编码  地址:http://china.e ...

随机推荐

  1. linux下mysql 查看默认端口号与修改端口号方法

    一.查看默认端口号 1.登录mysql [root@localhost ~]# mysql -uroot -pEnter password: 输入数据库密码: 2.使用show global vari ...

  2. CF1000G Two-Paths (树形DP)

    题目大意:给你一棵树,点有点权$a_{i}$,边有边权$w_{e}$,定义一种路径称为$2-path$,每条边最多经过2次且该路径的权值为$\sum _{x} a_{x}\;-\;\sum_{e}w_ ...

  3. webpack2.X、Vue学习以及将两者相结合

    在家的闲暇时间来完善自己的前端知识. 经过两三天的学习,按照webpack文档学习,vue文档学习,最后实现了两者结合的目标. webpack 按照网站上guide的流程依次学习 1.使用npm安装w ...

  4. mysql中的锁表语句查看方法汇总

    mysql> show status like 'Table%'; +----------------------------+----------+ | Variable_name | Val ...

  5. Android中加入思源字体/NotoSansCJK/SourceHanSans

    系统版本号:Android 4.2.2_r1 本文主要是在Android中加入思源字体的过程记录. 思源字体是Google和Adobe在2014.07.18公布的中文字体. 1.获取思源字体(Goog ...

  6. hadoop-09-安装资源上传

    hadoop-09-安装资源上传 在/software/www/html 下面上传 ambari  HDP  HDP-UTILS-1.1.0.21 文件,之后解压:

  7. POJ 2828 Buy Tickets(线段树·插队)

    题意  n个人排队  每一个人都有个属性值  依次输入n个pos[i]  val[i]  表示第i个人直接插到当前第pos[i]个人后面  他的属性值为val[i]  要求最后依次输出队中各个人的属性 ...

  8. hpuoj--1695--一道签到题(KMP)

    1695: 一道签到题 时间限制: 2 Sec  内存限制: 128 MB 提交: 72  解决: 36 [提交][状态][讨论版] 题目描述 我想说这是一道签到题,意思就是本次测试中最水的一道,不过 ...

  9. C#-汉字转拼音缩写

    /// 〈summary〉 /// 汉字转拼音缩写 /// Code By MuseStudio@hotmail.com /// 2004-11-30 /// 〈/summary〉 /// 〈para ...

  10. T4701 【卜卜】树状数组模板

    题目背景 令 夜 色 的 钟 声 响 起 令 黄 昏 (起 始) 的 钟 声 响 起 我 爱 (渴 望) 的 就 只 有 你 我 爱 ( 渴 望 ) 你 正因如此 独自安静地哭泣吧 正因如此 无论你在 ...