java的字符编码集(UNICODE,utf-8,gbk等)

来源:互联网 发布:淘宝禁售兴奋剂有哪些 编辑:程序博客网 时间:2024/05/22 03:25

字符串的序列化:

从char序列到byte序列的转化,叫做“编码”。

1>java的String本质上是char数组。

2>Unicode编码。与ISO-8859-1兼容。包含全世界所有的字符。均占2个字节。

3>utf-8:采用变长编码1-N方案。英文1个字节,中文3个字节

4>utf-16be编码:将16位的char从中间切开为2个byte。可以支持65535个字符编码

5>GBK:中国标准,支持20000+中日韩文。英文编码1byte,中文2byte。

6>ISO-8859-1:只支持英文字符,不支持中文。(sun服务器默认,如tomcat等)

java字符编码的原理:

先看个图:







这样编码就存在了问题,JVM内和JVM外。
1>java文件编译为class文件
例如:java代码中定义一个字符串:
String s = "汉字";
不管在java文件中采用何种编码,在编译为class文件后,都编程了Unicode编码。
2>JVM中的编码
JVM加载class文件是使用Unicode编码方式读取class文件。那么String s = "汉字“;zai 
JVM中仍然是Unicode编码。


String的方法getBytes()返回的是平台默认的编码方式。

需要注意的是,utf-8并非能容纳所有的中文字符编码,因此在特殊情况下utf-8转GB18030可能会出现乱码。
因此对于中文系统,最好选择GBK或者GB18030(其实GBK是GB18030的子集)



内存中的字符串乱码:

什么叫做内存中的字符串?
比如从JVM从文件中读取来的,从数据流获取的,从数据库获取的,并不限定是从class中获取到的字符串。
然而,他们基本上不是Unicode编码,原因很简单,存储优化。
因此需要处理各种各样的编码问题。
对字符串进行编码的时候应该调用如下方法:
getBytes(String charsetName);
String(byte[] bytes, String charsetName);
通过此可以对内存中的字符进行重新编码。

0 0
原创粉丝点击