字符集及乱码介绍

字符集

1.计算机的存储规则(ASCII):

  • 要存储的字符先查询对应的ASCII表,得到对应的ASCII码
  • 将对应的ASCII码编码(ASCII编码规则:前面补0,补齐8位),编码后放入计算机中储存

2.计算机的解码规则(ASCII):

  • 将计算机存储的数据解码(转成十进制),得到对应的ASCII值
  • 通过ASCII值取找到对应的字符

3.汉字字符集:

  • GB2312字符集:1980年发布,11981年5月1日实施的简体中文汉字编码国家标准。收录7445个图形字符,其中包括6763个简体汉字
  • BIG5字符集:台湾地区繁体中文标准字符集,共收录13053个中文字 ,1984年实施
  • GBK字符集:2000年3月17日发布,收录21003个汉字,包括国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字
  • 简体中文的Windows系统默认使用的就是GBK,但是系统会显示ANSI(兼顾其它含有中文的不同国家的操作系统)

4.Unicode字符集:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转化。

5.计算机的存储规则(GBK):

  • GBK字符集完全兼容ASCII字符集
  • 如果存储的是英文或者是ASCII码中的内容,那就按照原有的存储方式(一个英文字母一个字节,二进制第一位是0)
  • 如果存储的是汉字,汉字需要使用两个字节存储
  • 两个字节分为高位字节和低位字节,高位字节二进制一定以1开头,转成十进制后是一个负数

Unicode

1.编码规则与ASCII和GBK编码规则就有很大的不同:

  • UTF-16编码规则:用2~4个字节保存
  • UTF-32编码规则:固定使用4个字节保存
  • UTF-8编码规则:用1~4个字节保存(基本上使用这个,因此主要介绍utf-8)

2.在UTF-8(unicode transfer format)中,ASCII码使用1个字节储存,简体中文使用3个字节储存。

3.一位字节的ASCII码的首位必须是0,N位字节的第一个字节前N位为1,第N+1位为0,后面的每个字节都以10开头。比如4位字节的:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。

4.以汉字的“汉”为例,其二进制编码为01101100 01001001,查询utf-8编码规则,为

1110xxxx 10xxxxxx 10xxxxxxx ,将二进制编码按顺序填充到x中,最后即为11100110 10110001 10001001

5.根据utf-8的规则,一个英文站一个字节,二进制第一位是0,转成十进制是正数;一个中文站三个字节,二进制第一位是1.第一个字节转成十进制是负数。

乱码

1.原因:

  • 读取数据时未读完整个汉字(读取了部分字节)
  • 编码和解码时的方式不统一

2.解决方案(Java):

  • 不要用字节流读取文本文件(使用字符流)
  • 编码解码时使用同一个码表,同一个编码方式

Java中编码和解码的方法

1.Java中编码的方法(String类中的方法):

String类中的方法说明
public byte[] getBytes()使用默认方式进行编码
public byte[] getBytes(String charsetName)使用指定方式进行编码

在IDEA中默认编码方式是UTF-8,在eclipse中默认编码方式是GBK。

2.Java中解码的方法(String类的构造方法):

String类的g方法说明
String(byte[] byte)使用默认方式进行解码
String(byte[] byte,String charsetName)使用指定方式进行解码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值