Java的char类型真的可以存汉字么?

针对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编码存储产生了疑问。

到底是以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。

相关推荐