我自己出了一道面试题,如下:
public static void mainString[] args) { char a = '9'; char b = 9; char c = '我'; System.out.printlnInteger.valueOfc));//输出为 25105 } 请根据本页面右侧编码资料(ASCII码),回答以上Java代码【运行】后,a,b,c 依次在内存中 如何 存储的?
这道题就是考察之前说的字节与字符,这道题若知道原理的可以快速 利用 asc码和计算器,迅速得出答案。 A: java 是 unicode ,通常我们说 UTF-16 就是 unicode ,但是经过我的测试 UTF-16 又分:UTF-16BE 和 UTF-16LE 两种,java 采用的是 UTF-16BE; 既然是unicode 中文肯定可以存了。 C: 这项中文故意放了3个字节,通常人都会犯UTF-8的错误,我认为.java文件你可以保存为UTF-8编码的,编译成中间文件 .class 你也可以编译成UTF-8编码的,但是程序运行时就是以unicode为准,即运行时,char a = 'a'就是在内存中 占用2个字节。 D:原因同a
这篇文章与我猜想的一致,已经很充分的说明了问题:https://www.cnblogs.com/louiswong/p/6062417.html
.java .class 保存时 可以保存为 utf-8编码,但是运行时一定是 unicode编码。
pom.xml里的 如下配置都是指外码。
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> .java 的外码 编码 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 日志的外码 编码 <maven.compiler.encoding>UTF-8</maven.compiler.encoding> .class 的外码 编码
———————————————————————————–
在讨论这个问题之前,我们需要先区分unicode和UTF。
unicode :统一的字符编号,仅仅提供字符与编号间映射。符号数量在不断增加,已超百万。详细:[https://zh.wikipedia.org/zh-cn/Unicode]
UTF :unicode转换格式 unicode transformation format) 。定义unicode中编号的编码方式。utf8和utf16便是其中两种实现方式。其中utf8为变长表示,长度可能时1~6个字节;utf16为变长表示,长度可能是2或4个字节。详细:UTF8 [https://zh.wikipedia.org/zh-cn/UTF-8] UTF16 [https://zh.wikipedia.org/zh-cn/UTF-16]
接着,要分清内码(internal encoding)和外码(external encoding)。
内码 :某种语言运行时,其char和string在内存中的编码方式。
外码 :除了内码,皆是外码。
要注意的是,源代码编译产生的目标代码文件(可执行文件或class文件)中的编码方式属于外码。
先看一下内码
JVM中内码采用UTF16。早期,UTF16采用固定长度2字节的方式编码,两个字节可以表示65536种符号(其实真正能表示要比这个少),足以表示当时unicode中所有字符。但是随着unicode中字符的增加,2个字节无法表示所有的字符,UTF16采用了2字节或4字节的方式来完成编码。Java为应对这种情况,考虑到向前兼容的要求,Java用一对char来表示那些需要4字节的字符。所以,java中的char是占用两个字节,只不过有些字符需要两个char来表示。
详细:
[https://docs.oracle.com/javase/tutorial/i18n/text/unicode.html]
[http://www.zhihu.com/question/27562173]
外码
Java的class文件采用UTF8来存储字符,也就是说,class中字符占1~6个字节。
Java序列化时,字符也采用UTF8编码,占1~6个字符。
总结:
java中内码(运行内存)中的char使用UTF16的方式编码,一个char占用两个字节,但是某些字符需要两个char来表示。所以,一个字符会占用2个或4个字节。
java中外码中char使用UTF8的方式编码,一个字符占用1~6个字节。
UTF16编码中,英文字符占两个字节;绝大多数汉字(尤其是常用汉字)占用两个字节,个别汉字(在后期加入unicode编码的汉字,一般是极少用到的生僻字)占用四个字节。
UTF8编码中,英文字符占用一个字节;绝大多数汉字占用三个字节,个别汉字占用四个字节。
EOF