JVM-java字符编码
在JVM内部,所有的字符都是用Unicode编码的。而对于JVM所在操作系统的文件系统,可能有不同的编码类型。
由于JVM和OS文件系统所使用的编码方式不同,JVM在与操作系统进行数据交互的时候,就会进行编码转换。因此可以说,所有的乱码问题一定是JVM和OS文件系统进行数据交互时候出了问题。
- import java.io.*;
- public class Demo{
- public static void main(String [] args) throws Exception {
- File file=new File("D:\\test.txt");//mark1
- FileInputStream fis=new FileInputStream(file);
- InputStreamReader isr=new InputStreamReader(fis,"GB2312");//mark2
- File toFile=new File("D:\\toTest.txt");
- FileOutputStream fos=new FileOutputStream(toFile);
- OutputStreamWriter osr=new OutputStreamWriter(fos);
- int content=-1;
- while((content=isr.read())!=-1){
- osr.write(content);
- }
- isr.close();osr.close();
- fis.close();fos.close();
- System.out.println(System.getProperty("file.encoding"));//笔者的系统默认编码是UTF-8
- }
- }
对于上面的代码,功能是将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字符编码的更多相关文章
- Java 字符编码归纳总结
String newStr = new String(oldStr.getBytes(), "UTF-8"); java中的String类是按照unicode进行编码的 ...
- 【字符编码】Java字符编码详细解答及问题探讨
一.前言 继上一篇写完字节编码内容后,现在分析在Java中各字符编码的问题,并且由这个问题,也引出了一个更有意思的问题,笔者也还没有找到这个问题的答案.也希望各位园友指点指点. 二.Java字符编码 ...
- 【JAVA编码专题】 JAVA字符编码系列三:Java应用中的编码问题
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换
http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- Java 字符编码(二)Java 中的编解码
Java 字符编码(二)Java 中的编解码 java.nio.charset 包中提供了一套处理字符编码的工具类,主要有 Charset.CharsetDecoder.CharsetEncoder. ...
- Java 字符编码(三)Reader 中的编解码
Java 字符编码(三)Reader 中的编解码 我们知道 BufferedReader 可以将字节流转化为字符流,那它是如何编解码的呢? try (BufferedReader reader = n ...
- Java 字符编码(一)Unicode 字符编码
Java 字符编码(一)Unicode 字符编码 Unicode(http://www.unicode.org/versions/#TUS_Latest_Version) 是一个编码方案,说白了希望给 ...
- java字符编码详解
引用自:http://blog.csdn.net/jerry_bj/article/details/5714745 GBK.GB2312.iso-8859-1之间的区别 GB2312,由中华人民共和国 ...
- JAVA字符编码三:Java应用中的编码问题
第三篇:JAVA字符编码系列三:Java应用中的编码问题 这部分采用重用机制,引用一篇文章来完整本部分目标. 来源: Eceel东西在线 问题研究--字符集编码 地址:http://china.e ...
随机推荐
- vue mint-ui swipe 不显示或显示空白
vue mint-ui swipe 不显示或显示空白? 解决需要在mt-swipe上层元素设置高度 <div> <div> <mt-header title=" ...
- 时间就是金钱HNCOI2000(最短路)
时间就是金钱HNCOI2000 版权声明:本篇随笔版权归作者YJSheep(www.cnblogs.com/yangyaojia)所有,转载请保留原地址! 人们总是选时间最短或费用最低的路线 例如, ...
- 国庆 day 2 下午
最大值(max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一本书,上面有很多有趣的OI问题.今天LYK看到了这么一道题目: 这里有一个长度为n的 ...
- java 自定义实现base64编码转换
1.base64编码转换 所谓base64编码,即按照规则把字符转化为"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456 ...
- 代理server poll version
poll和select一样,管理多个描写叙述符也是进行轮询,依据描写叙述符的状态进行处理,可是poll没有最大文件描写叙述符数量的限制,select is 1024/2048 #include &qu ...
- vs输出窗口,显示build的时间
https://stackoverflow.com/questions/82128/displaying-build-times-in-visual-studio Tools... Options.. ...
- Hadoop的目录结构
- SharePoint 学习快速导航
根据我的学习过程,会不断的增加一些学习的快速链接 . 入门篇 SharePoint入门链接,针对刚刚开始了解SharePoint 的朋友,我也是处在入门的状态,随后会慢慢的累积增加 安装 | 部署 | ...
- VS导出方法名和方法备注的方法
VS导出方法名和方法备注的方法 方法一: 只能导出图片格式的UML 类图 1.点击查看类图 2.在空白处点击讲关系导出为图像 方法二: 是把整个类库的方法名都罗列出来 这个方便整理一些 具体方法如下 ...
- java必会的英语单词
Java开发常用英语单词表 第一章:public['pʌblik] 公共的,公用的static['stætik] 静的;静态的;静止的void:[vɔid] 空的main:[mein] 主要的 重 ...