java中 编码 解码 乱码 解惑
来源:互联网 发布:淘宝仅退款被判刑 编辑:程序博客网 时间:2024/05/11 20:22
首先说一下,乱码的英语是mojibake!
java编程中,关于编码有三个地方需要弄清楚,java源文件、class文件、虚拟机
java源文件
源文件可以是任何编码的文件,这取决于保存形式。所以编译时需要指明源文件的编码方式,比如 javac -encoding utf8 HelloWorld.java,如果不指定,默认是操作系统编码。
本来java读取文件跟文件编码无关,但是,在javac编译过程中,存在将二进制解码为字符,然后再将字符编码为二进制的过程,所以需要指定源文件的编码方式。
class文件
无论源文件的编码格式是什么,class文件都是modified UTF-8,modified utf-8是java对utf-8作了修改的版本,正因为class文件的编码方式的统一,所以class文件才会跨平台
modified utf-8与传统utf-8的的异同:在基本平面内也就是字符u+0000-u+FFFF范围内,都是一样的存储方案。在增补平面内,modified utf-8是用6个字节表示一个字符,utf-8,使用4个字节表示一个字符。这是因为java发布的时候,unicode的基本平面,还远远没有满,modified utf-8将增补平面内的字符,分解为两个代码点比如0xyyy,0xzzz,每个代码点使用3个字节表示,所以就是一共6个字节。
java虚拟机编码
java虚拟机的编码是utf-16,双字节表示一个字符,请切记java虚拟机中的编码方式是utf-16
java生命周期
java源文件---->class 文件------->jvm(输入流、输出流)---------->控制台
上述任何一个阶段,都会存在编码解码,只要存在编码解码就会存在乱码的问题。
- public class HelloWorld{
- public static void main(String[] args){
- System.out.println("哈哈");
- }
- }
问题:
byte[] arr = "x".getBytes();
这句程序的意思是,返回字符串x在操作系统默认编码方案下的字节数组,通常情况下,中文操作系统是gbk,英文操作系统是iso8859-1,可以通过-Dfile.encoding=xx,来影响操作系统的默认编码(jvm认为的操作系统编码),通过查看源码会发现,这个设置最终会影响Charset.defaultCharset()
关于-Dfile.encoding与charset.defaultcharset(),可以参考我的另一篇博文-Dfile.encoding与Charset.defaultCharset()关系
- java中 编码 解码 乱码 解惑
- Java字符的编码解码与乱码问题 Java字符的编码解码与乱码问题
- 编码、解码、乱码原理
- 主题:java编码解惑
- Java中文乱码解决之道:Java是如何编码解码的
- Base64编码解码过程中中文乱码问题
- Java字符编码及解码乱码研究---背景知识
- java中文乱码解决之道(六)-----javaWeb中的编码解码
- java转换流、乱码之编码与解码
- encodeURIComponent编码后java后台解码乱码的解决
- java中文乱码解决之道(六)-----javaWeb中的编码解码
- java中文乱码解决之道(六)-----javaWeb中的编码解码
- Java字符的编码解码与乱码问题
- java转换流、乱码之编码与解码
- java中文乱码解决之道(六)-----javaWeb中的编码解码
- java中字符串的编码解码问题
- java中字符串的编码解码问题
- java 中使用base64编码和解码:
- WPF 之消息队列
- [leetcode][hash] Single Number II
- Android学习笔记--SharedPreferences的使用
- 51单片机项目 模拟智能传送装置
- 23.创建ViewController的三种方式
- java中 编码 解码 乱码 解惑
- Vijava学习笔记之(HostSystem 内存(总容量和已使用))
- 命令行中的数据科学
- Vjava学习笔记之(VirtualMachine 内存(总容量和已使用))
- JSONObject与JSONArray的使用
- java 中容易误解的地方
- Java多线程系列--“基础篇”07之 线程休眠
- Delphi中线程类TThread 实现多线程编程
- ADO 获取连接字符串