针对char类型存入汉字的进一步解析及一些编码知识。疑问Java中的变量是否都是以Unicode编码存储的。
目录
谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
0、big endian和little endian
1、字符编码、内码,顺带介绍汉字编码
2、Unicode、UCS和UTF
2.1、内码和code page
3、UCS-2、UCS-4、BMP
4、UTF编码
5、UTF的字节序和BOM
6、进一步的参考资料
附录1 再说说区位码、GB2312、内码和代码页
今天偶尔看到一句话: ANSI编码表示英文字符时用一个字节,表示中文用两个字节,而unicode不管表示英文字符还是中文都是用两个字节来表示。我突然间对自己之前对java变量以Unicode编码存储产生了疑问。
Java对象序列化ObjectOutputStream和ObjectInputStream示例
到底是以Unicode编码存储的还是和源文件使用的编码格式相同呢?
联想到之前的一个问题java的char类型是否可以存储汉字, 这个问题是有着肯定答案的:可以。 但是疑惑之余我还是做了个测试。
写一个简单的测试文件, 内容如下:
public class TestANSI{
public static void main(String[] args) {
char cc = '在';
System.out.println(cc);
}
}
以上文件以ANSI格式存储。使用javac TestANSI.java编译, java TestANSI运行可以看到输出了汉字 在。
将以上文件复制一份, 修改为TestUTF8, 使用Notepad++转为UTF8格式打开,再次编译运行
javac -encoding utf8 TestUTF8.java
java TestUTF8
可以看到正确输出了 汉字 在。
但是以上测试并不足以证明char型变量是以Unicode编码存储的。
我们在eclipse中编写如下测试程序:
@Test
public void testChar() throws Exception {
char c = '从';
//UTF8: 20174 GBK:20174
System.out.println(String.valueOf(c).codePointAt(0));
}
将文件格式分别设置为UTF-8和GBK可以看到输出的Unicode代码点相同。
这说明char变量确实是以Unicode编码存储的, 我们再打开java api可以看到Character和String中大量篇幅都是在说明char和String是以UTF-16来存储的。
以下是我从JDK7的源码中摘出来的一句话:
Character information is based on the Unicode Standard, version 6.0.0.
JDK6中也有这么一句, 只是版本号是4.0。