java string 字符集_JAVA字符集

背景

字符集和编码是两个不同的概念

字符集 --- 指对某些语言文字的编号,这个编号是字符集的原始编码

编码 --- 一个字符集一般会有多种具体编码,用于计算、存储、传输

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

举例 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了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值