淮安做网站找哪家公司,verycloud wordpress,网站引导制作,php网站后台密码忘记文章目录 字符集的来历汉字和字母的编码特点Unicode字符集字符集小结编码和解码开发约定 字符集的来历
计算机是美国人发明的#xff0c;由于计算机能够处理的数据只能是0和1组成的二进制数据#xff0c;为了让计算机能够处理字符#xff0c;于是美国人就把他们会用到的每一… 文章目录 字符集的来历汉字和字母的编码特点Unicode字符集字符集小结编码和解码开发约定 字符集的来历
计算机是美国人发明的由于计算机能够处理的数据只能是0和1组成的二进制数据为了让计算机能够处理字符于是美国人就把他们会用到的每一个字符进行了编码所谓编码就是为一个字符编一个二进制数据如下图所示图片来自于百度百科只需要了解常见的英文字母大小写、数字等就好了不需要细究 美国人常用的字符有英文字母、标点符号、数字以及一些特殊字符这些字符一共也不到128个所以他们用1个字节来存储1字符就够了。 美国人把他们用到的字符和字符对应的编码总结成了一张码表这张码表叫做ASCII码表也叫ASCII字符集。
其实计算机只在美国用是没有问题的但是计算机慢慢的普及到全世界当普及到中国的时候在计算机中想要存储中文那ASCII字符集就不够用了因为中文太多了随便数一数也有几万个字符。
于是中国人为了在计算机中存储中文也编了一个中国人用的字符集叫做GBK字符集这里面包含2万多个汉字字符GBK中一个汉字采用两个字节来存储为了能够显示英文字母GBK字符集也兼容了ASCII字符集在GBK字符集中一个字母还是采用一个字节来存储。
汉字和字母的编码特点
如果一个文件中既有中文也有英文那计算机怎么知道哪几个字节表示一个汉字哪几个字节表示一个字母呢
比如在文件中存储一个我he你底层其实存储的是这样的二进制数据。
需要我们注意汉字和字母的编码特点 如果是存储字母采用1个字节来存储一共8位其中第1位是0如果是存储汉字采用2个字节来存储一共16位其中第1位是1
当读取文件中的字符时通过识别读取到的第1位是0还是1来判断是字母还是汉字
如果读取到第1位是0就认为是一个字母此时往后读1个字节。如果读取到第1位是1就认为是一个汉字此时往后读2个字节。
也即GBK规定了汉字的第一个字节的第一位必须是1.
Unicode字符集
咱们国家可以用GBK字符集来表示中国人使用的文字那世界上还有很多其他的国家他们也有自己的文字他们也想要自己国家的文字在计算机中处理于是其他国家也在搞自己的字符集就这样全世界搞了上百个字符集而且各个国家的字符集互不兼容。 这样其实很不利于国际化的交流可能一个文件在我们国家的电脑上打开好好的但是在其他国家打开就是乱码了。
为了解决各个国家字符集互不兼容的问题由国际化标准组织牵头设计了一套全世界通用的字符集叫做Unicode字符集。在Unicode字符集中包含了世界上所有国家的文字一个字符采用4个字节才存储。
在Unicode字符集中采用一个字符4个字节的编码方案又造成另一个问题如果是说英语的国家他们只需要用到26大小写字母加上一些标点符号就够了本身一个字节就可以表示完用4个字节就有点浪费。
于是又对Unicode字符集中的字符进行了重新编码一共设计了三种编码方案。分别是UTF-32、UTF-16、UTF-8; 其中比较常用的编码方案是UTF-8
UTF-8这种编码方案的特点总结如下 1.UTF-8是一种可变长的编码方案共分为4个长度区 2.英文字母、数字占1个字节兼容(ASCII编码) 3.汉字字符占3个字节 4.极少数字符占4个字节 字符集小结 ASCII字符集《美国信息交换标准代码》包含英文字母、数字、标点符号、控制字符 特点1个字符占1个字节 GBK字符集中国人自己的字符集兼容ASCII字符集还包含2万多个汉字 特点1个字母占用1个字节1个汉字占用2个字节 Unicode字符集包含世界上所有国家的文字有三种编码方案最常用的是UTF-8 UTF-8编码方案英文字母、数字占1个字节兼容(ASCII编码)、汉字字符占3个字节 编码和解码
其实String类类中就提供了相应的方法可以完成编码和解码的操作。
编码把字符串按照指定的字符集转换为字节数组解码把字节数组按照指定的字符集转换为字符串
示例代码如下所示
/*** 目标掌握如何使用Java代码完成对字符的编码和解码。*/
public class Test {public static void main(String[] args) throws Exception {// 1、编码String data a我b;byte[] bytes data.getBytes(); // 默认是按照平台字符集UTF-8进行编码的。System.out.println(Arrays.toString(bytes));// 按照指定字符集进行编码。byte[] bytes1 data.getBytes(GBK);System.out.println(Arrays.toString(bytes1));// 2、解码String s1 new String(bytes); // 按照平台默认编码UTF-8解码System.out.println(s1);String s2 new String(bytes1, GBK);System.out.println(s2);}
}开发约定
开发一个项目的时候最开始的时候首先要设定的就是代码的编码格式如果不约定好后面很容易因为各种编码混用造成乱码。一个项目具体的编码格式一般来说统一就好要按照实际需求来。例如我曾经实习的时候就约定好了 .java文件使用GBK编码其他文件都一致使用UTF-8编码。