关于字符集转换的本质问题。

UTF-8

UTF-16BE

UTF-16LE

GB2312

GBK

这些眼花缭乱的字符集是在弄的自己十分眼晕。到底为啥经常性出现乱码。今天老大一番讲解终于明白到底咋回事了。

 

这些东西全部是各地组织编制的字符映射表,通过对应不同byte得到不同的字符,比如 0x0041在UTF-8理代表拉丁文的A,但到GB2312中0x0041代表的不一定就是拉丁文的A,而在GB2312里代表拉丁文A的byte字节可能是0xffec了。而在机器的通讯中所有数据都会通过byte形式发出去。所以如果两边对这段byte解释的标准不一样就会出现乱码.(也就是说参照的映射表不一样)

 

举例,小学生布置作业,A个同学没有超下来作业的页码,打电话给另外一个B同学(通讯建立)询问数学作业的内容。B同学告诉A同学作业在数学书(映射表,例如utf-8)页码12页第三题(就像byte),而A同学拿着语文书 (不同的映射表GB2312)找12页第三题根本找不到。就会出现错误。

 

Java中很多数据都可以使用getbyte()方法获得数据的2进制字节形式,所以要注意他的编码格式,也就是所参照的映射表。例如String.getbytes(),此方法获得的byte是按照本地映射表进行理解的,也就是说如果该类的编码格式是utf8他就会按照utf8的映射表吧String内容转换成byte形式(类的编码格式可以在eclispe中更改)。所以如果在另外一端的机器上读取该信息按章不同于原始映射表来理解就会出现错误(例如之前小学生那个例子)。为了避免这种错误最好强制规定好两边的编码形式,使用String.getbytes(String charset)来规定字符集格式例如String.getbytes("UTF-8"),也就是说无论你本地编码是什么他都按照utf-8的映射表来把字符串转换成bytes,在另外一端接收到这个byte后使用new String(bytes,"UTF-8")来得到字符串就不会出现错误。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值