美文网首页
彻底搞定乱码-乱码产生的原因-1

彻底搞定乱码-乱码产生的原因-1

作者: dancer4code | 来源:发表于2019-10-05 11:30 被阅读0次

    1.什么是乱码?

    指的是由于本地计算机在用文本编辑器打开源文件时,使用了不相应字符集而造成部分或所有字符无法被阅读的一系列字符。

    2.乱码产生的原因?

    编码与解码方式不统一(编码方式有很多种)
    文件在保存时是有编码格式的,只有当保存时使用的编码格式与读取时使用的编码格式相同时才能正确读取文件;例如UTF-8编码、GBK编码都可以读取中文,那么如果采用UTF-8编码保存文件,但是采用GBK编码读取文件就会造成乱码,因此UTF-8编码保存的文件应该使用UTF-8编码读取;

    3. 编码方式介绍

    说到编码方式,就不能不说,计算机的存储单位以及进制(现有的系统基本是基于二进制的,只能识别1和0。现在我们看到的网页、视频、图片、文字.....都是构建在其上的。)

    存储单位
    1 Byte (字节)= 8 Bits(位,信息量的最小单位)
    1 KB = 1024 Bytes
    1 MB = 1024 KB
    1 GB = 1024 MB
    存储单位

    进制
    二进制
    八进制
    十进制
    十六进制
    进制

    字符编码介绍

    • ASCII:在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。
      ASCII码
      ASCII码.jpg
    ASCII特殊字符解释.jpg
    • ISO-8859-1:又称Latin-1,计算机一开始只在美国使用,ASCII可以表示他们的符号,但是后来欧洲一些国家也开始使用计算机,很多国家使用的不是英文,ASCII的256个位置不够了,为了表示这些字符,就重新进行了编码,ISO-8859-1是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致,0x80-0x9F之间是控制字符,0xA0-0xFF之间是文字符号。此字符集主要支持欧洲使用的语言。

    • GB2312:后来计算机普及了,于是就中国要使用计算机了 但是机器不认得中文,于是就有了国际码, GB,是“国标”二字的汉语拼音首字母,1980年制定,由于“历史局限性”,此字符集内收录的字符很少,汉字总共收录了 6763 个,而且全部都是大陆通用的简体汉字。

    • BIG5:在GB2312肆虐横行的同时,我们的港澳台同胞,也制定了一个适用于当地繁体汉字需要的字符集,其对应编码名为 BIG5,也有人称之为大五码。

    • GBK:后来发现一些人名、文言文汉字、少数民族语言都需要支持,GB2312满足不了,就做了扩展,叫GBK标准,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号,21003个汉字及提供了1894个造字码位。

    • UNICODE:随着计算机的普及,编码也众多,需要统一,一个叫 ISO (国际标谁化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"。

    • UTF-8: 互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一, 其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。
      UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
      UTF-8的编码规则很简单,只有二条:

      • a)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

      • b)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

    • ANSI: 不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。

    编码对比

    编码对比.png

    发展
    ASCII(1字节)——>ISO8859-1(1字节)——>GB2312(2字节)——>GBK(2字节)——>unicode(utf-8(变长度编码),utf-16,utf-32)

    编码方式.jpg

    相关文章

      网友评论

          本文标题:彻底搞定乱码-乱码产生的原因-1

          本文链接:https://www.haomeiwen.com/subject/kczspctx.html