当前位置: 首页 > news >正文

字符串编码(ASCII, GBK, ANSI, Unicode(‘\u‘), UTF-8编码)

字符串编码的发展

       1、首先,计算机只能处理数字,文本转换为数字才能处理。计算机中8个bit作为一个字节,所以一个字节能表示最大的数字就是255

      因为计算机是美国人发明的,所以一个字节可以表示所有字符了,所以ASCII(一个字节)编码就成为美国人的标准编码(ASCII, American Standard Code for Information Interchange, 美国标准信息交换码)

     

      2、但是ASCII处理中文明显是不够的,中文不止255个汉字,所以中国制定了GB2312编码,用两个字节表示一个汉字。GB2312还把ASCII包含进去了,同理,日文,韩文等等上百个国家为了解决这个问题就都发展了一套字节的编码,标准就越来越多,如果出现多种语言混合显示就一定会出现乱码

   

    3、于是unicode出现了,将所有语言统一到一套编码中

    看一下ASCII和unicode编码:
    1)字母A用ASCI编码十进制是65,二进制01000001

    2)汉字“中”已近超出了ASCII编码的范围,用unicode编码是20013二进制是0100111000101101

    3)A用unicode编码只需要前面补0二进制是0000000001000001

      节选

4、乱码问题解决了,但是如果内容全是英文,unicode编码比ASCII需要多一倍的存储空间,同时如果传输需要多一倍的传输。

     当文件很多的时候,这一倍空间实际上是非常大的(如果1个T的话想一下,而一个T在大公司里面是很常见的)

5、所以出现了可变长的编码“utf-8",把英文变长一个字节,汉字3个字节。特别生僻的变成4-6字节,如果传输大量的英文,utf8作用就很明显

   

     中文当然就没有减少空间

utf8编码在文件存储或网络传输的时候的优势就特别大

但是如果实在内存种的时候字符串有的占1个字节,有的2个,就很不好捉摸

所以unicode编码虽然占用空间,但是在编程的时候,在内存里面处理的时候比会utf8更简单,因为它们都是一样的长度

所以一般是做文件保存或网络传输的时候,将unicode编码转换成utf8编码

从文件里面读取数据的时候,将utf8编码转换成unicode编码来进行处理

python3字符串在内部中全部使用unicode进行编码的

GBK编码

    GBK编码专门用来解决中文编码的,是双字节的。不论中英文都是双字节的。     

    由于ASCII编码不支持中文,因此,当中国人用到计算机时,就需要寻求一种编码方式来支持中文。于是,国人就定义了一套编码规则:当字符小于127位时,与ASCII的字符相同,但当两个大于127的字符连接在一起时,就代表一个汉字,第一个字节称为高字节(从0xA1-0xF7),第二个字节为低字节(从0xA1-0xFE),这样大约可以组合7000多个简体汉字。这个规则叫做GB2312
     但是由于中国汉字很多,有些字无法表示,于是重新定义了规则:不在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。这种扩展之后的编码方案称之为GBK标,包括了GB2312的所有内容,同时新增了近20000个新的汉字(包括繁体字)和符号。
    但是,中国有56个民族,所以,我们再次对编码规则进行了扩展,又加了近几千个少数民族的字符,于是再次扩展后得编码叫做GB18030。中国的程序员觉得这一系列编码的标准是非常的好,于是统统称他们叫做"DBCS"(Double Byte Charecter Set 双字节字符集)。

ANSI码

      ANSI编码是一种对ASCII码的拓展:ANSI编码用0x00~0x7f (即十进制下的0到127)范围的1 个字节来表示 1 个英文字符,超出一个字节的 0x80~0xFFFF 范围来表示其他语言的其他字符。也就是说,ANSI码仅在前128(0-127)个与ASCII码相同,之后的字符全是某个国家语言的所有字符。值得注意的是,两个字节最多可以存储的字符数目是2的16次方,即65536个字符,这对于一个语言的字符来说,绝对够了。还有ANSI编码其实包括很多编码:中国制定了GB2312编码,用来把中文编进去另外,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准。受制于当时的条件,不同语言之间的ANSI码之间不能互相转换,这就会导致在多语言混合的文本中会有乱码。

Unicode编码

    \u开头的就是unicode编码

    因为世界国家很多,每个国家都定义一套自己的编码标准,结果相互之间谁也不懂谁的编码,就无法进行很好的沟通交流,所以及时的出现了一个组织ISO(国际标准化组织)决定定义一套编码方案来解决所有国家的编码问题,这个新的编码方案就叫做Unicode。注意Unicode不是一个新的编码规则,Unicode只是一个用来映射字符和数字的标准,是一套字符集(为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)),可以将Unicode理解为一本世界编码的字典。

     Unicode编码与ASCII编码方式兼容 

UTF-8

        互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。

      UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
 

相关文章:

  • Python网络爬虫与信息提取(三):网络爬虫之提取(Beautifulsoup bs4)
  • 查看win10系统日志
  • Windows安全模板配置
  • Python网络爬虫与信息提取(四):网络爬虫之实战(淘宝商品比价 股票数据)
  • Python—Scrapy爬虫框架
  • 大数据技术原理与应用(一):大数据概述
  • 大数据技术原理与应用(二):大数据处理架构Hadoop
  • 大数据技术原理与应用(三):分布式文件系统HDFS
  • Ubuntu18.04安装 Codeblocks
  • Win10将某个软件/文件添加到开始屏幕(磁贴)
  • phpStudy(LAMP)
  • Win10创建新用户账户
  • Win10家庭版增加本地安全策略(组策略)
  • 后台登录密码绕过+sql注入+一句话木马 实验演示(盾灵)
  • 网络攻防实验之Web服务蜜罐部署实验
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • Java到底能干嘛?
  • magento 货币换算
  • SQLServer之索引简介
  • Twitter赢在开放,三年创造奇迹
  • Web设计流程优化:网页效果图设计新思路
  • 从零开始在ubuntu上搭建node开发环境
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 前端面试之CSS3新特性
  • 前端之Sass/Scss实战笔记
  • 手机端车牌号码键盘的vue组件
  • 通过npm或yarn自动生成vue组件
  • 阿里云API、SDK和CLI应用实践方案
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​【已解决】npm install​卡主不动的情况
  • ​插件化DPI在商用WIFI中的价值
  • ​马来语翻译中文去哪比较好?
  • ###STL(标准模板库)
  • #NOIP 2014# day.2 T2 寻找道路
  • (+4)2.2UML建模图
  • (1)SpringCloud 整合Python
  • (70min)字节暑假实习二面(已挂)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)nsfocus-绿盟科技笔试题目
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET : 在VS2008中计算代码度量值
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET 服务 ServiceController
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .so文件(linux系统)
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)