java编码原理,java编码和解码问题
java的编码方式原理
java的JVM的缺省编码方式由系统的“本地语言环境”设置确定,和操作系统的类型无关 。
在JAVA源文件-->JAVAC-->Class-->Java-->getBytes()-->new String()-->显示的过程中,每一步都有编码的转换过程,这个过程总是存在的,只是有的时候用默认的参数进行。
JAVAC是以系统默认编码读入源文件,然后按UNICODE进行编码的。如果没有指定编码格式而是以系统默认的编码格式进行读入文件操作,但是文件格式和系统默认编码不一致,就会在编译时出现乱码现象。
在myeclipse中,javac可以根据文件的类型,由myeclipse来确认编码的类型,来读入源文件,这样就可以智能化的读入,而不需要进行转码等操作。然后按UNICODE进行编码的。
-------------------------------
在运行过程中,JAVA也是采用UNICODE编码的,并且默认输入和输出的都是操作系统的默认编码。但是,我们可以在程序中给其指定一个规定的字符集进行编码和解码操作。
在byte[] buffer=string.getBytes();中,如果没有给.getBytes();指定字符集,那么在编码过程中,就会按照系统默认的编码格式进行编码。
在输出的过程中。如果没有指定的字符集,程序也会按照运行环境默认的字符集输出。
因此,在java程序的运行过程中,字符的转换过程是:
在java虚拟机(即JVM)对源文件进行编译时,jvm按照系统默认或者按照指定的字符集将源文件解码成JVM能看懂的字符,然后将字符编码成unicode格式存储在内存中。编译后字符 数据会以UNICODE格式存入字节码文件中,生成class文件。
在JVM运行程序时,因为字节码中的字符总是UNICODE格式,所以java读取字节码文件并没有编码转换过程。虚拟机读取文件后,字符数据便以UNICODE格式存储在内存中了。
-------------------------------
在java程序的运行过程中,也就是java程序在内存中执行的过程里。程序内的输入和输出都要考虑字符集的转换问题。
比如:
String string="你静夜思\r\n 李白\r\n 床前明月光,\r\n 疑似地上光;\r\n 举头望明月,\r\n 低头思故乡。\r\n Oh Yh Come On!!!!!";
byte[] buffer=string.getBytes();//该行代码可以将string中的字符串转变成相应字符集中的数字编码,即字节码本程序中系统默认编码为utf-8。
在编译时,string中的所有字符和java源文件一样(其实string字符串包含在java源文件中)在编译时被编码成了unicode格式,编译过程只对java源文件进行操作,不包含目标文件等。
在运行过程中,要将unicode格式的字符串string装到buffer里。此过程需要将unicode格式的string进行编码。如果没有指定编码的格式,比如“.getBytes();”程序就会按照运行
环境默认的编码格式进行编码(我们常用的运行环境一般为eclipse或者操作系统,eclipse的默认编码格式可以自己调整,方法另外查找;中文操作系统默认使用GBK格式),那么在操作系统的控制台上运行时,string就会被编码成GBK格式的字节码存储。但是为了保证不出现乱码问题我们可以对其字符集进行限制(“.getBytes("utf-8");”),这样就会使string按照utf-8格式
进行编码。
-------------------------------
在要将程序中的内容输出到文件里时,比如:
File file=new File("file21.txt");
FileOutputStream fos=new FileOutputStream(file,true);
String string="你静夜思\r\n 李白\r\n 床前明月光,\r\n 疑似地上光;\r\n 举头望明月,\r\n 低头思故乡。\r\n Oh Yh Come On!!!!!";
byte[] buffer=string.getBytes();
/*
for (byte b : buffer)
System.out.println(b);
*/
System.out.println("当前JRE:" + System.getProperty("java.version"));
System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());
fos.write(buffer);
fos.close();
在此程序中,利用FileOutputStream fos将字符串输出到文件里,如果执行程序之前没有建立file21文件,程序会自动根据buffer=string.getBytes();所指定的字符集建立一个文件。如果在执行程序前已经有目标文件,就会将文件写入到指定文件里,但是要注意字符格式问题,因为字符格式不一致会导致写入的文件乱码。
注:FileOutputStream fos=new FileOutputStream(file,true);当加上true时,会自动在目标文件后添加内容,上述操作才成立。否则就会新建立一个目标文件并且将目标文件的格式个改为和输出的字符串相同的格式。
-----------------------------------
当向程序中输入文件时,例如:
File file=new File("new.txt");
FileInputStream fis=new FileInputStream(file);
byte[] buffer=new byte[(int) file.length()];
fis.read(buffer);
此执行的过程为:
在编译时,JVM虚拟机只会检查和读取java源文件,只要源文件没有错误就可编译通过。而不会对程序需要操作的目标文件执行任何操作。
在执行时,会将fis中的文件读到内存中然后将其读取到java程序里。在读取到程序里的过程中,JVM会将目标文件按照源文件格式进行编码,将编码后的字节码读取到程序中。
在要将其读出时,例如:
//从文件中提取内容
FileInputStream fis=new FileInputStream(file);
buffer=new byte[(int) file.length()];
//读出内容并进行编码,编码的格式是按照源文件的格式进行编码(作用是将将文件内容转换成所有程序都能通用和识别的字节型数组)
fis.read(buffer);
主要关注这部分:
String str=new String(buffer,"gbk");
System.out.println(str);
fis.close();
如果没有给字节码指定字符集,那么就会按照运行环境默认的字符集进行解码 那么如果字符集不一致就会乱码。
java编码原理,java编码和解码问题的更多相关文章
- 编码原理_base64编码原理
1.1 Base64编码原理 1.1.1 概要: Base64是通讯传输中较为常见的编码方式之一. (注意是编码算法,而非加密算法) 参数传输的过程中会经常遇到的一种情况:使用英文不会涉及到乱码, ...
- Mysql编码, Mysql编码流程, Mysql编码顺序, Mysql编码原理, Mysql编码修改依据
编码查看方式以及解释说明: 需要以root用户身份登陆才可以查看数据库编码方式(以root用户身份登陆的命令为:>mysql -u root –p,之后两次输入root用户的密码),查看数据库的 ...
- google protocol buffer——protobuf的编码原理二
这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们主要通 ...
- 字符串编码原理--PHP数组原理与高级应用
基础知识 1.有几种表达方式(查看手册)2.单引号和双引号的区别,双引号解析变量.\n,\t等,八进制与十六进制编码 内部存储方式 c语言中怎么表示字符串,结构体存储了字符指针和长度1.字符串可以用[ ...
- 签名、BOM头、编码、Windows记事本编码、java编码解码的那些事
对于Windows记事本: ANSI :GB2312 java中应使用GBK解码 Unicode :有签名的UTF-16LE java中应使用UTF-16解码 Unicode big endian : ...
- encodeURIComponent编码后java后台的解码 (AJAX中文解决方案)
encodeURIComponent编码后java后台的解码 (AJAX中文解决方案) 同学的毕业设计出现JavaScript用encodeURIComponentt编码后无法再后台解码的问题. 原来 ...
- encodeURIComponent编码后java后台的解码
解决方法一: JavaScript: window.self.location="searchbytext.action?searchtext="+encodeURICompone ...
- java、js的编码、解码
如果在地址栏挂载参数,特别是包含中文,往往要进行编码,取值时再解码,以下是java和js中编码.解码的各自方法. java: @Test public void test3() throws Unsu ...
- Js编码和Java后台解码
1.java.将resultMsg 转为utf-8 (1) resultMsg = URLEncoder.encode(resultMsg, "utf-8"); (2) new S ...
随机推荐
- 【技巧】使用weeman来做一个钓鱼网页
本文来自网友836834283 对玄魂工作室的投稿. 工具项目地址:https://github.com/Hypsurus/weeman/ 克隆地址:https://github.com/Hypsur ...
- 如何利用 Visual Studio 自带工具提高开发效率
Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...
- egret调用页面js的方法。
参考文献: http://bbs.egret-labs.org/thread-267-3-1.html http://docs.egret-labs.org/post/manual/threelibs ...
- Vue 给子组件传递参数
Vue 给子组件传递参数 首先看个例子吧 原文 html <div class="container" id="app"> <div clas ...
- Ajax 加载数据 练习 自我有些迷糊了,写的大概请谅解 ^ _ ^
查询表的显示,查询显示如果不嵌入PHP代码的话,用ajax怎么实现? <h1>显示数据</h1> <table width="100%" bord ...
- Dapper:The member of type SeoTKD cannot be used as a parameter Value
异常汇总:http://www.cnblogs.com/dunitian/p/4523006.html#dapper 上次说了一下Dapper的扩展Dapper.Contrib http://www. ...
- git命令分类图
- SQL Server-简单查询示例(十一)
前言 本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解,Always to review the basics. EOMONTH 在SQL Server 2012的教程示例中 ...
- Log4net入门(回滚日志文件篇)
在上一篇Log4net(日志文件篇)中,我们使用"log4net.Appender.FileAppender"将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会 ...
- 如何通过官方渠道为Windows 10 添加具有中国特色的字体
Windows 10的变化细节上个人认为要比Windows 8多很多,而且很多功能找到之后还是小惊喜,就是挺多好用的地方居然都不正经宣传一下,微软真是搞得悄悄地干活? 今天为大家介绍一下通过官方途径添 ...