设为首页 加入收藏

TOP

Java的char类型真的可以存汉字么?
2014-11-23 22:59:18 来源: 作者: 【 】 浏览:6
Tags: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。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇NIO拷贝文件真的比IO拷贝文件效率.. 下一篇HTML5中的标记方法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: