JAVA编码格式和占据内存大小
Java语言使用的是Unicode字符集,每个字符在内存中占16位。
一个中文或英文字符的unicode编码都占2个字节。
在unicode中,一个字符就是两个字节
数据和存储空间的大小
1.bit就是位,也叫比特位,是计算机表示数据最小的单位
2.byte就是字节
3.1byte=8bit ,0001 1100,一般用两个16进制来显示,所以我们经常看到1个字节显示为 1c
1个字节就是8位
4.1byte就是1B
1B=1/1024KB 1M=1024KB
通常情况下:
–GBK GB2312 占据2个字节 1个字符2个字节
–UTF-8 3 个字节 1个字符3个字节
java的String使用的编码是Unicode。
将’中’字转为Unicode编码,结果是’\u4e2d’。
'\u’的就是使用了Unicode编码。后面加上十六进制代码来表示Unicode字符。
- Unicode是一种“编码”,所谓编码就是一个编号(数字)到字符的一种映射关系,只是一种一对一的映射而已。
- GBK、UTF-8是一种“编码格式”,是用来序列化或存储1中提到的那个“编号(数字)”的一种“格式”。
java的String使用的编码是Unicode,当String存在于内存中时(在代码中用string类型的引用对它进行操作时),是"只有编码而没有编码格式的",所以java程序中的任何String对象,说它是gbk还是utf-8都是错的,String在内存中不需要“编码格式”, 它只是一个Unicode的字符串而已。
当字符串需要在网络中传输或要被写入文件时,就需要使用编码格式了。乱码问题也因此出现。
ASCII码和Unicode:
ASCII码,和Unicode编码一样,也是一种"编码"。
ASCII码的范围比较小,一共规定了128个字符的编码。
Unicode编码是一个很大的集合,现在的规模可以容纳100多万个符号。就像它的名字都表示的,这是一种包含所有符号的编码。
在JVM中defaultCharset()是在初始化阶段被调用, 且只会初始化一次, 首先会取file.encoding指定的字符集, 如果取不到则使用系统默认字符集(如: windows下为GBK), 然后通过
取到的字符集名称(csn)去获取Charset对象, 如果能获取到则将其设为defaultCharset, 如果取不到则将defaultCharset设置为UTF-8字符集, defaultCharset一旦被初始化后, 在JVM之后的运行过程中
就无法再进行更改, 比如在JVM启动后在程序中使用properties.setProperty(“file.encoding”,“UTF-8”);也不会改变defaultCharset的值~~~
如果想指定defaultCharset的值, 则可以通过JVM启动参数(-Dfile.encoding=“UTF-8”)来显示的指定此JVM的字符集!!!
Java编译器(即编译成class文件时) 用的是unicode。
通过下面输出可以看到当前选用的编码方式:
System.out.println(System.getProperty(“file.encoding”));
System.out.println(System.getProperty(“sun.jnu.encoding”));