首页 / 操作系统 / Linux / 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编码存储产生了疑问。Java 8简明教程 http://www.linuxidc.com/Linux/2014-03/98754.htmJava对象初始化顺序的简单验证 http://www.linuxidc.com/Linux/2014-02/96220.htmJava对象值传递和对象传递的总结 http://www.linuxidc.com/Linux/2012-12/76692.htmJava对象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm到底是以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.javajava 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。更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-06/103044p2.htm