码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA字符集

时间:2015-11-24 09:55:37      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

背景
字符集和编码是两个不同的概念
字符集 --- 指对某些语言文字的编号,这个编号是字符集的原始编码
编码 --- 一个字符集一般会有多种具体编码,用于计算、存储、传输

注意:有的字符集没有其他具体编码,直接使用原始编码进行计算、存储、传输

举例 UNICODE字符集,这个字符集把全世界的所有字符(包括字母、象形文字)统一赋予一个唯一编号,这个就是UNICODE原始编码
UTF-8 UTF-16 UTF-32等等这些编码 都是针对UNICODE字符集的编码
为什么不用字符集(这里指UNICODE)原始编码直接存储、传输、计算?
因为UNICODE原始编码最少要2个字节才能表示一个字符
会导致计算不兼容(比如C语言的字符串函数,就是以一个值为0的字节为结束标志的,而UNICODE字符好多高位都是0X00 会被解释成NULL),会导致老程序出现错误,当然和老程序的互通,不兼容ASCII码 都会导致问题
会导致存储不兼容,因为计算机CPU存在大小端问题,UNICODE原始码2个字节的顺序,在不同计算机上解释是不同的,会导致解析错误
减小存储空间,提供传输效率,因为ASCII码在UNICODE里最少都是2个字节存储,对英语存储大了一倍,而UTF-8(对ASCII码完全兼容,用一个字节表示ASCII码)就没有这种问题


注意:以下所提到的字符集 其实都是指某种字符集的某种具体编码,平常经常说道的字符集 其实都是特指某种具体编码

JAVA字符集

JAVA源代码文件字符集
CLASS文件(编译好的文件)使用的字符集
内存中字符使用的字符集
外部数据有自己的字符集,和java交互数据时 需要转换
JSP文件字符集
JSP文件中指定的字符集

JAVA 字符串在内存中使用UCS2字符集,一个字符一般是2个字节,也有4个字节;
在读、写文件,网络收、发包 等外部交互数据时 ,才需要把内存中的字符串和外设的byte数组互相转换,这时就涉及字符集问题了,序列化/反序列化时最好指定字符集编码,
否则JVM使用当前系统使用的字符集来序列化/反序列化;如果当前系统字符集不和对方不一致,会导致乱码;
比如 byte[] dest = str.getBytes("UTF-8"),如果调用这个getBytes函数进行序列化时,不指定字符集,就是用系统字符集gb2312,如果对方要求用UTF-8,那就有乱码了;
同理 str new String(dest,"UTF-8"),如果调用这个函数进行解码时,如果不指定字符集,也是使用系统字符集,可能会导致解码成乱码;


编程影响


编程时,以下几点要注意

1.读文件/写文件 字符集

看以下代码
File file = new File("/root/tmp"); //不涉及外设,只是构造了一个内存对象
InputStream ins = new FileInputStream(file); //打开文件流,这个涉及外设,不过流只是byte数组,还不涉及编码
InputStreamReader insr = new InputStreamReader(ins,"UTF-8");//字符读取器,这个涉及到字符编码,因为要从字节数组,转换成内存字符了

写文件和这个类似,主要是涉及到byte char互相转换时候,就涉及到字符集转换了;
java中真正的流 都不涉及字符集,仅仅是byte流读写


2.网络收/发包 字符集
收到的都是byte数组,最终发送的也是byte数组,转换时候注意字符集就行
TOMCAT默认使用ISO-8859-1编码,支持不了中文,

3.java源文件 字符集
这个在编译器工作时,需要明确指明java源文件的编码类型,否则可能会导致编译失败,也可能会导致运行错误。
.java文件的编码和javac 指定的编码要一致,编译成功后,都是UTF-8字符集,就无错误了

4.JSP文件字符集
JSP文件本身的字符集和JSP文件中指定的字符集 要一致,否则可能导致乱码,编译时候就导致错误了,一般这2个字符集一致,就OK了

JAVA字符集

标签:

原文地址:http://www.cnblogs.com/hubaoxi/p/4990519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!