ASCII, Unicode, UTF-8, 8进制, 16进制等各种编码学习理解笔记
字符编码的发展历史
在这个问题下的于洋的最高票回答中,比较完整地介绍了字符编码的发展历史,为了便于记忆,再次简要概括一番。
一个字节:最初一个字节的标准是混乱的,出现过4位、6位、7位的一字节标准,最终由于历史原因和物理存储需求(8位是2的3次方,方便物理存储),所以采用了8位为一个字节的标准。
ASCII:定下了8位为一个字节后,那么一个字节可以表示的状态就有256种(2^8),对应0-255号。接下来就需要考虑8位如何表示一个字符了,ASCII码顾名思义(American Standard Code for Information Interchange)就是美国的信息交换标准码,因此只需要表示出英文字母和少数的标点符号以及操作控制符号即可,于是人们把这些需要编码的字符编到了0-127号(包括127),这种编码方式就是ASCII码。后来为了满足更多地区的字符编码的需求,127号之后的位置也被编码了字符,包含了127号之后的ASCII码被称为扩展ASCII码。
GB2312等: 但是一个字节最多只能编码256个字符,对于世界上的语言字符来说远远不够,比如中文的汉字就有许许多多,因此中国采用了GB2312、GBK、GB18030等双字节字符集(DBCS)的编码方案,还有各个地区和语言采用了各自的编码方案,编码方案不统一的问题就造成了很大的困扰。
Unicode:面对这种困扰的局面,国际标准化组织(ISO)决定来解决这个问题,他们做了一个包含了地球上所有文化、字母、符号的编码方案Unicode,并且统一采用双字节,对于原来的单字节的符号,低位编码不变,扩展其高位为0变为双字节符号,这样就解决了标准与统一的问题。
但是Unicode也有一些问题,一是计算机如何区分编码为Unicode字符还是两个ASCII字符,二是半角符号(就是原来的ASCII方案里的一字节字符)只占用了一个字节的空间,Unicode占用了双倍的空间,对于英文字母等半角字符来说,直接多占用了一倍的空间,这是极大的浪费。因此,Unicode在很长的一段时间内难以推广。
UTF:直到后来UTF(UCS Transfer Format)标准的出现,Unicode才得到更好的使用。UTF是一种字符在网络上的传输方案,专为数据传输而设计,UTF-16就是一次传输16位的数据,UTF-8就是一次传输8位的数据。其中UTF-8是使用最广的一种Unicode的实现方式,它的一大特点就是它是一种变长度的编码方式,当字符在ASCII码范围内是,使用一个字节代表一个字符,字符在别的范围内时,又是另外的长度,比如中文使用三个字节的长度。UTF-8通过一些算法和规则来实现Unicode的转换。
而在javascript中,\u表示使用Unicode编码,比如\u0078表示字符x,\x表示使用16进制的ASCII码,比如\x78也表示x,\[0-7][0-7][0-7]表示使用8进制的ASCII吗,比如\170表示x。
总结:
编码方案最初为ASCII码,且只用了0-127号,后来由于需要使用更多字符的原因,发展为扩展ASCII码,之后由于各个地区和语言的不同,出现了许多编码标准,比如中国的GB2312等。面临这种局面,ISO制定了Unicode来实现编码的统一,由于Unicode的一些缺点,没有得到更大的推广。直到UTF,尤其是UTF-8这些传输方案的出现,Unicode得到了大范围的使用。
另外在Javascript中,\u表示使用Unicode编码,[0-7][0-7][0-7]表示使用8进制的ASCII码,\x表示使用16进制的ASCII码。
ASCII, Unicode, UTF-8, 8进制, 16进制等各种编码学习理解笔记的更多相关文章
- C++ 10进制, 16进制, ASCII码, 单字节与多字节的相互转换
这些简单的转换是用的比较频繁的, 因此将这些功能全部封装在一个类中 头文件 #pragma once #include <stdlib.h> #include <string> ...
- JS吧数字转成2进制 8进制16进制数据
; number.toString(); //转成2进制 number.toString();//转成8进制 number.toString();//转成10进制 number.toString(); ...
- 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析(转)
. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenco ...
- ASCII UNICODE UTF "口水文"
最近接了一个单是需要把非 UTF-8 (No BOM)编码的文件转换成 UTF-8 (No BOM),若此文件是 UTF-8 但带有 BOM ,需要转换成不带 BOM 的.于是开启了一天的阅读.首先花 ...
- 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析
1. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenc ...
- Oracle中如何进行进制转换(2进制,10进制,16进制)
1.16进制转换为10进制 可以通过to_number函数实现 SQL> select to_number('19f','xxx') from dual; TO_NUMBER('19F','XX ...
- java中 8进制 10进制 2进制 16进制 相互转换
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- Delphi - 10进制16进制相互转换
10进制转16进制 使用IntToHex可以实现十进制到十六进制的转换,注意这里的参数有两个,第一个表示需要被转换的10进制数,第二个表示转换后用几位来显示16进制数. 代码如下: function ...
- c#与js中10进制16进制的转化,记录防忘
js: var param="11"; param=parseInt(param,16); //17 param=parseInt(param,10); //11 //后面的参 ...
随机推荐
- 打包发布到Tomcat
idea: file-->project structure --> Artifacts --> 点+号 web application exploded from m ...
- ajax的4个字母分别是什么意思
Asynchronous JavaScript and XML 的缩写,异步的JavaScript和XML.在不重新加载整个页面的情况下 ,AJAX 与服务器交换数据并更新部分网页.
- JavaScript学习-5——异步同步、回调函数
----------异步同步函数 ----------回调函数 一.异步同步函数 同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以再发送下一个请求 同步可以 ...
- LevelDB源码分析-Version
Version VersionSet类 VersionSet管理整个LevelDB的当前状态: class VersionSet { public: // ... // Apply *edit to ...
- 视频修复工具recover_mp4,视频录制一半掉电,如何查看已保存数据?
在生产环境中,视频通常是一种重要的文件证据,但是,如果因为各种原因,导致视频在录制到一半过程中失败, 比如:监控到一半,录制设备掉电.虽然,掉电后的视频肯定找不到,但是,有时,长时间工作生产的视频通常 ...
- elasticsearch批量修改,批量更新某个字段
1.源生API 在这里没有用官方提供的bulk API,而是用的另外一种方式. POST /infomations/infomations/_update_by_query JSON请求格式 { &q ...
- Leetcode1000 合并石头的最低成本 区间DP
有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数. 找出把所有石头合并成一堆的最低成 ...
- Activity 启动模式 FLAG
原文:https://blog.csdn.net/youhongyan/article/details/64151922 一.Activity启动模式的设置在AndroidManifest.xml文件 ...
- eclipse在mac上的快捷键
Command + Shift + R: 搜索本地项目文件 Command + Shift + T: 搜索jar中的文件 Command+t:快速显示当前类的结构 command+O: 在某个类文件, ...
- 分支&循环
分支 单分支 if 条件: 满足条件后要执行的代码 双分支 if 条件: 满足条件执行代码 else: if条件不满足就走这段 多分支: if 条件: 满足条件执行代码 elif 条件: 上面的条件不 ...