一、Java中默认的编码方式:
编码问题存在两个方面:JVM之内和JVM之外。
1、Java文件编译后形成class
这里Java文件的编码可能有多种多样,但Java编译器会自动将这些编码按照Java文件的编码格式正确读取后产生class文件,这里的class文件编码是Unicode编码(具体说是UTF-16编码)。
因此,在Java代码中定义一个字符串:
String s="汉字";
不管在编译前java文件使用何种编码,在编译后成class后,他们都是一样的----Unicode编码表示。
2、JVM中的编码
JVM加载class文件读取时候使用Unicode编码方式正确读取class文件,那么原来定义的String s="汉字";在内存中的表现形式是Unicode编码。
二、关于文本
1.这个世界上从来没有纯文本这回事,如果你想读出一个字符串,你必须知道它的编码。如果你不知道一段数据流的编码方式,你就永远不会知道这里面的内容。
2.Unicode是一个简单的标准,用来把字符映射到数字上。Unicode协会的人会帮你处理所有幕后的问题,包括为新字符指定编码。我们用的所有字符都在unicode里面有对应的映射,每个映射称为一个码点。
3.Unicode并不告诉你字符是怎么编码成字节的。这是被编码方案决定的,通过UTF来指定。
三、二进制与字符的转换
1.进制流到屏幕字符的过程:
二进制流->根据编码方式解码出码点->根据unicode码点解释出字符->系统渲染绘出这个字符
2.文本字符保存到计算机上的过程:
输入字符->根据字符找到对应码点->根据编码方式把码点编码成二进制流->保存二进制流到硬盘上
从这个过程我们可以知道能不能从二进制流读取出字符关键就在于能不能找到二进制流的编码,掌握了编码方式的信息就可以用对应的逆过程解码。
四、Java中的文本及编码
下面以一个程序来说明。
package com.io;
public class encodeTest {
//unicode指的是一种编码字符集,即所谓的万国码,而UTF-8,UTF-16(LE,BE)都只是针对这种字符集的一种编码方式。
public static void main(String[] args) throws Exception{
String str = "中国CJL";
//项目默认编码utf-8,中文占用3个字节,英文占用一个字节
byte[] bytes = str.getBytes();
for (byte b : bytes) {
System.out.print(Integer.toHexString(b & 0xff) + " "); //16进制显示,和16的与位运算,移除前边的00000
//e4 b8 ad e5 9b bd 43 4a 4c
}
System.out.println();
//GBK编码,中文占用2个字节,英文占用1个字节
byte[] bytesGBK = str.getBytes("gbk");
for (byte b : bytesGBK) {
System.out.print(Integer.toHexString(b & 0xff) + " ");
//d6 d0 b9 fa 43 4a 4c
}
System.out.println();
//utf-16be编码,中文2个字节,英文2个字节-Java默认编码
byte[] bytesUTF16BE = str.getBytes("utf-16be");
for (byte b : bytesUTF16BE) {
System.out.print(Integer.toHexString(b & 0xff) + " ");
//4e 2d 56 fd 0 43 0 4a 0 4c
}
}
}
/*
* 输出
* e4 b8 ad e5 9b bd 43 4a 4c
* d6 d0 b9 fa 43 4a 4c
* 4e 2d 56 fd 0 43 0 4a 0 4c
* */
说明:以上内容均来自于互联网及个人整理,如有侵权,请联系我。