前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程必备基础知识|计算机组成原理篇(06):计算机的字符与编码集

编程必备基础知识|计算机组成原理篇(06):计算机的字符与编码集

原创
作者头像
不会飞的小鸟
修改2019-09-16 10:19:48
6080
修改2019-09-16 10:19:48
举报
文章被收录于专栏:只为你下只为你下

  计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识。关于计算机基础的课程很多,内容繁杂,但无论是相关书籍还是大学课程,都有点脱离工作。特别地,计算机基础知识体系庞杂,想要从零学习或者复习都耗时耗力。

  

  有鉴于此,本系列文章将带你更快的补足编程必备基础知识,涵盖计算机领域三大基础知识:计算机组成原理、操作系统、计算机网络,这些都是大学计算机课程里面最重要的内容。文章对这些内容做了提炼和总结,摒弃了作为程序员不需要掌握的知识。

  

  目的是:

  

  帮助大家形成计算机知识的结构体系

  

  帮助大家理解计算机底层原理

  

  帮助大家在工作实践中借鉴其中的优秀设计

  

  本篇是计算机组成原理之计算机的字符与编码集。

  

  欢迎关注、转发、收藏、评论

  

  字符编码集的历史

  

  ASCII码

  

  对于ASCII码,相信大家在平时的学习、工作中都有所了解。

  

  ASCII码,英文全称为:American Standard Code for Information Interchange,翻译过来就是:美国信息交换标准代码,是我们平常常用的一种编码。那它是怎么来的呢?

  

  在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),假如,对于字符a,比尔盖茨想用0001来表示,而乔布斯想用0010来表示,那么他们在沟通交流的时候谁都无法理解对方的语言。因此,为了计算机能够互相通信而不造成混乱,就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

  

  标准ASCII码也叫基础ASCII码,使用7个比特位来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符,共定义了128(2的7次方)个字符。

  

  下面我们通过一张表来了解部分ASCII码。

  

  表中列出了常见字符的ASCII码,如:字母a表示为01100001、字符(不是数字哦~)1表示为00110001... ...

  

  在计算机的早期,ASCII码就能满足特定人群的使用了,但是,随着计算机的发展以及计算机的普遍性,ASCII码逐渐不能满足人们的使用需求,比如一些数学符号以及一些国家的符号都无法表示。于是,人们对ASCII码进行了扩充,用8个比特位来表示一个字符,这就是拓展的ASCII码,拓展的ASCII码能表示256个字符。

  

  Extended ASCII码

  

  如下图,是拓展的ASCII码表。

  

  这里面包括了常见的数学运算符、带音标的欧洲字符以及其他常用符号、表格符号等。使用了拓展的ASCII码极大的补充了原来的码表,使得计算机能表达的内容越来越丰富。

  

  字符编码集的国际化

  

  随着计算机的进一步发展,越来越多的国家加入到了使用计算机的行列中,对字符编码集的要求也越来越高。对于欧洲、中亚、东亚、拉丁美洲等国家来说,它们的语言丰富多样,体系不一样,不以有限字符为组合,尤其以中国、韩国、日本等的语言最为复杂,ASCII码表根本无法表达这些语言,这就迫切需要使用新的编码集,也就是字符编码集的国际化。

  

  中文编码集

  

  GB2312

  

  GB2312是1980年制定的中国汉字编码国家标准,是我国最早最完备的一个编码集,一共收录了7445个字符,包括6763个汉字和682个其他字符,一个汉字占用两个字节。

  

  GBK

  

  由于GB2312不符合国际标准,中国的科学家在1995年推出了第二套完备的编码集——GBK,GBK向下兼容GB2312,向上支持国际ISO标准,收录了21003个汉字,支持全部中日韩汉字。

  

  GB2312和GBK都是比较完备的编码集,但是,它们只是一个本地化的编码,在中国使用是没问题的,但要跨国使用就有问题了。举个例子,一个中国人开发了一个网站,一个外国友人访问了这个网站,如果他们本地没有安装GB2312编码集或GBK编码集的话, 那么他们在访问网站网页的时候看到的会是乱码。因此,就需要一个全球统一的编码规范。

  

  Unicode

  

  为了统一所有文字的编码,Unicode应运而生。Unicode是一个兼容全球的字符集,定义了世界通用的符号集,可以表达全世界所有的文字和字符。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

  

  我们平时用的UTF-8是其中一个编码规则,它以字节为单位对Unicode进行编码,平常写代码的时候都是推荐使用UTF-8编码。中文Windows操作系统默认使用GBK编码,因此,使用IDE编程时通常要设置成UTF-8编码。

  

  protected AbstractUrlBasedView buildView(String viewName) throws Exception {

  

  AbstractUrlBasedView view = (AbstractUrlBasedView)BeanUtils.instantiateClass(this.getViewClass());//获得一个视图类 有继承关系

  

  view.setUrl(this.getPrefix() + viewName + this.getSuffix());//获取我们在配置文件中配置的prefix 和suffix和传进来的viewName

  

  String contentType = this.getContentType();

  

  if (contentType != null) {

  

  view.setContentType(contentType);//视图类型

  

  return view;//返回我们的视图

  

  复制代码

  

  我们通过这个方法可以发现,首选这个方法创建了一个视图,虽然我们不认识,但是他们间接的有继承关系,我们可以自行查看继承结构。

  

  然后就是获取我们在SpringMVC中配置的InternalResourceViewResolver的prefix和suffix还有viewName名,构成一个完整的url例如:/WEB-INF/a.jsp,最后把构成的视图返回构成了一个

  

  InternalResourceView视图。然后InternalResourceView视图会把Controller处理器返回的模型属性全部都放到HttpServletRequest里面,让我们看下底层的执行

  

  复制代码

  

  //调用的是InternalResourceView对象的方法

  

  protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {

  

  this.exposeModelAsRequestAttributes(model, request);//通过调用这个方法然后执行放置到request,看接下来下面片段的代码

  

  this.exposeHelpers(request);

  

  String dispatcherPath www.qiaoheibpt.com= this.prepareForRendering(request, response);

  

  RequestDispatcher rd = this.getRequestDispatcher(request, dispatcherPath);

  

  if (rd == null) {

  

  throw new ServletException("Could not get RequestDispatcher for [" + this.getUrl() + "]: Check that the corresponding file exists within your web application archive!");

  

  } else {

  

  if (this.useInclude(request, response)) {

  

  response.setContentType(this.getContentType());

  

  if (this.logger.isDebugEnabled()) {

  

  this.logger.debug(www.hongyangpt.cn "Including resource [www.sanguoyoux.cn" + this.getUrl() + "] in InternalResourceView '" + this.getBeanName() + "'");

  

  }

  

  rd.include(request, response);

  

  } else {

  

  if (this.logger.isDebugEnabled(www.luqintang.com)) {

  

  this.logger.debug("Forwarding to resource [www.luqintang.com" + this.getUrl() + "] in InternalResourceView '" + this.getBeanName() + "'");

  

  rd.forward(request, response);

  

  复制代码

  

  复制代码

  

  //调用的是AbstractView 类

  

  protected void exposeModelAsRequestAttributes(Map<String, Object> model, HttpServletRequest request) throws Exception {

  

  Iterator var3 = model.entrySet().iterator();

  

  while(var3.hasNext(www.jintianxuesha.com)) {

  

  Entry<String, Object> entry = (Entry)var3.next();

  

  String modelName = (String)entry.getKey();

  

  Object modelValue = entry.getValue(www.luqintang.com);

  

  if (modelValue www.renhewhpt.cn!= null) {

  

  request.setAttribute(modelName, modelValue);//把Controller返回的模型属性值放入

  

  if (this.logger.isDebugEnabled(www.hongyangpt.cn)) {

  

  this.logger.debug("Added model object '" + modelName + "' of type [" + modelValue.getClass().getName() + "] to request in view with name '" + this.getBeanName(www.jintianxuesha.com) + "'www.sanguoyoux.cn");

  

  }

  

  } else {

  

  request.removeAttribute(modelName);

  

  if (this.logger.isDebugEnabled(www.hongshengyl.cn)) {

  

  this.logger.debug("Removed model object '" + modelName + "' from request in view with name 'www.qiaoheibpt.com " + this.getBeanName() + "'");

  

  复制代码

  

  然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL

  

  以上就是InternalResourceViewResolver解析流程

  

  连贯起来就是

  

  InternalResourceViewResolver会把返回的视图名称都解析为InternalResourceView对象,InternalResourceView会把Controller处理器方法返回的模型属性都存放到对应的request属性中,然后通过RequestDispatcher在服务器端把请求forword重定向到目标URL。比如在InternalResourceViewResolver中定义了prefix=/WEB-INF/,suffix=.jsp,然后请求的Controller处理器方法返回的视图名称为test,那么这个时候InternalResourceViewResolver就会把test解析为一个InternalResourceView对象,先把返回的模型属性都存放到对应的HttpServletRequest属性中,然后利用RequestDispatcher在服务器端把请求forword到/WEB-INF/a.jsp。

  

  最后我们在总结下总体的视图解析流程:

  

  1、调用目标方法,SpringMVC将目标方法返回的String、View、ModelMap或是ModelAndView都转换为一个ModelAndView对象;

  

  2、然后通过视图解析器(ViewResolver)对ModelAndView对象中的View对象进行解析,将该逻辑视图View对象解析为一个物理视图View对象;

  

  3、最后调用物理视图View对象的render()方法进行视图渲染,得到响应结果。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档