无论在编译前java文件使用何种编码,在编译后成class后,都是用Unicode编码表示。java
jdk在编译的时候,若是没有用-encoding参数指定java源程序的编码格式, 则javac首先得到操做系统默认采用的编码格式(xp是GBK)。而后jdk把java源文件从该编码格式转化为java内部默认的unicode格式放入内存中,随后 javac把转换后的unicode格式的文件进行编译成.class类文件,此时.class文件是unicode编码的,它暂放在内存中。紧接着,jdk将此以unicode编码的编译后的class文件保存到操做系统中造成.class文件。最终得到的.class文件是内容以unicode编码格式保存的类文件,它内部包含源程序中的中文字符串,只不过此时它己经由安装系统编码格式转化为unicode格式了。mysql
一个英文字母(不分大小写)占一个字节。sql
一个字节来讲有 8 位;每一位能够表示两种状态,也就是 0 或 1,这样排列组合下来,一个字节就能够表示 256(2∧8) 种不一样的状态。
但并不足以标识全部国家的字符集,因而有了Unicode。编码
一个英文占两个字节,一个中文(含繁体)占两个字节;中文标点占两个字节,英文标点占两个字节。
统一都用 Unicode 来表示,那必然须要以占用字节最多的字符长度为标准。但用多个字节表示英文会浪费内存,咱们须要一个可变长度的字符编码规则,当是英文时就用一个字节表示,甚至能够彻底兼容 ASCII 码。 因而有了UTF-8。spa
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。 (utf-8的mysql库 VARCHAR2(32) 能支持32个中文, length() 是 96。)操作系统
利用两种规则能够表示一个字节以及多字节的字符。code
大体规则以下:blog
这样即可根据字符的长度最大程度的节省存储空间。内存
固然还有其余的编码规则,好比 UTF-16
、UTF-32
,平时用的很少,但本质上都和 UTF-8
同样,都是 Unicode
的不一样实现,也是用于表示世界上大部分文字的字符集。utf-8