在Java的学习中,明白什么是字符集合、什么是乱码,如何解决乱码?
author:Alex FJ
Date: 2019.12.11
2.1、字符集合的概念
在计算机中,存储的符号永远都是2进制码,而不是方块字或者英文字母。2进制码,每8位构成一个字节,代表了一个0-255的数字。
那么,这个数字代表什么呢?如果是字母的话,比如说65代表A,而97代表了a,这个规则就是一个字符集,流行的就是ASCII字符集。
而ASCII码的全程为"American Standard Code for Information Interchange",也就是“美国信息交换标准码。这也叫做计算机的内码(code),后来也被用于国际标准码。
计算机处理的是2进制数,为了方便计算机工作,定义了字符到2进制数的映射,这就是ASCII码。但它只包括一些基本的字符和英文字母还有0到9之间的字符,并不包含汉字等其他字符。ASCII值是从0到127。
2.1.1 ASCII的背景
人们发明了计算机,并知道如何使用内存中的0101来表示数和机器码。但是人类最主要的信息展现形式是文本,如何用内存中的bit来表示文本一直困扰着人们,这种情况一直持续到ASCII码发明成功后才被“部分”解决。说白了,ASCII码就是解决了一个以数字形式表示文本的问题。
ASCII码于1968年提出,用于在不同计算机硬件和软件系统中实现数据传输标准化,在大多数的小型机和全部的个人计算机都使用此码。
ASCII码划分为两个集合:128个字符的标准ASCII码和附加的128个字符的扩充和ASCII码。
每个ASCII码以1个字节(Byte)储存,从0到数字127代表不同的常用符号,列如大写A的ASCII码是65,小写a则是97。
由于ASCII字节的7个位,最高位并不使用,所以后来又将最高的一个位也编入这套内码中,成为8个位的延伸ASCII(ExtendedASCII)码,这套内码加上了许多外文和表格等特殊符号,成为目前常用的内码。
ASCII码由8位2进制数组成,其中前7位2进制码表示命令、字母、数码和符号,最高位作为检验位,用于传输过程检验其正确性。ASCII码共有128个编码。除去表示32个命令以外,还可以表示52个英文大、小写字母,10个阿拉伯数码和许多符号。
ASCII码由8位2进制数组成,其中前7为2进制码表示命令、字母、数码和符号,最高位作为检验位,用于传输过程检验其正确性。
2.1.2 实例
(1)ASCII码'A' -- 其内存存储字节2进制表示为"0100 0001" --- 其16进制值为0x41 --- 其10进制值为65(这里的值实际上是'A'在ASCII码表中的编号);
(2)ASXII码'6' -- 其内存存储字节2进制表示为"00110110" --- 其16进制值为0x36 --- 其10进制值为54(这里的值实际上是'6'中ASCII码表中的编号);
2.1.3 ASCII码通讯
利用ASCII码作为通讯方式到底是一种什么样的通讯方式呢?(FTP协议中有两种通讯方式,其中一种是ASCII码方式,即文本方式)这里也举例说明:比如我们要传输数值123,123数值用16进制表示为0x7b,以2进制表示为0111 1011,那么以2进制方式通讯,01111 1011就是我们真实传送的数据,但是如果以ASCII码方式通讯,则完全不同了,如果你们还传送0111 1011的话,对方那边得到的将是'{' ('{'对应的ASCII码用16进制表示为7b)。那么我们该如何传呢?正确的方式就是将123每位上的数字转换为其相应的ASCII码,然后传送。这里'1'、'2'和'3'对应的ASCII码用16进制表示,分别为0x31、0x32和0x33。这样组合起来后要传送的数据应为“0011 0001”、“0011 0010”和“0011 0011”。
2.1.4 总结与扩展
一个字符串中内存中就是按照逐个字符的ASCII码连续存放的,我们在传送字符串时一般无需做特殊转换。
字符集就是一组规定了的字和符号。编码,就是给字符集中每一字符各有一个独一无二的数字号码,相当于定义一组向量,一列是字和符号形状,另一列是它的码。
代码页code page是IBM的传统术语,就是“一张字符编码表”。当然这个“张”可以很大也可以很小。例如IBM PC(OEM)code page,中文GBK code page。
GB2312 code page是双bytes码,两字节大于0xA0A0的表,也就是说code page里可能含有部分空白(少数码,没有字符)。
不同国家或地区,拥有的字符集也不尽相同,后来诞生了unicode字符集,基本涵盖了世界上所有的语言符号,相当于是部世界语。
UTF是unicode的传送码,即unicode编码后的编码。UTF的编码方法很简单,用算术表达式计算就可以了,看3字节的utf-8数据没有意思。unicode与字符集对应,utf-8与unicode值对应。
计算机内码就是指令码,数据和地址。
2.2 什么是乱码
乱码其实就是指“由于本地计算机在用文本编辑器打开源文件时,使用了不相应字符集而造成部分或所有字符无法被阅读的一系列字符。”,而造成其结果的原因也是多种多样的。
编程上乱码就是出现错误,在应用程序上显示不出来,通俗的来说就是你的应用识别不了你的代码,你看到的是一堆乱七八糟的编码。相当于用两本不同的字典寻找同一页码位置上显示的符号内容,就会出现错误,变成乱码。
2.3 解决乱码的方法
示例:涓€鐩翠互鏉ワ紝浼撮殢镌
这是Utf-8编码,用GB来解读,就会成为乱码。恢复后是:“一直以来,伴随”。根据具体情况,有不同的解决办法。在用notepad 编写java程序的时候,有用到中文的情况,只要转为ANSI编码就行了。因为windows操作系统上的cmd命令行用的编码是ANSI,所以在上面编译和运行程序的时候要使用相同的字符集。