深入编解码:ASCII,UNICODE,UTF8等
ASCII
ASCII = American Standard Code for Information Interchange(美国信息交换标准码)
美国最先有了计算机技术,计算机里面只有01,也就是数字,要用数字代表附号,所以需要制定一张数字附号对应表。
所以美国就自己定义了一张表,也就是ascii表,用7位bit代表一个附号,最多表示128个附号。
Unicode
很快,其他国家的不同附号都要登场,就需要扩展附号表,起初是各个国家各自扩展,各自为政,结果混在一起就乱码,
于是就统一制定了Unicode,依次用更大的数字对应更多的附号。
最终产生了一张100多万条记录的附号表。如:4E25
表示汉字严
具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。
Unicode的机器表示
计算机最终采用的是8字节存放数据,也就是byte。
unicode这么大量的数据,需要几个字节才能表示所有的附号,
那就有问题了,当读到一个字节时,如何确定是表示一个完整的附号,还是附号中的一部分呢?
思路相当简单,就是用每个byte的前缀表示固定的含义,剩余部分拼装成Unicode值即可。
Utf-8,Utf-16,ANSI,Unicode(UCS-2 ),Big-endian,Little-endian等都是这个思路,只是格式不同罢了。
文件中字符的编码格式在文件头部的元数据中有指定:
文件的一个元数据叫BOM(byte-order mark)了,BOM位于文件二进制流的最前方,标识当前文件的编码格式。UTF16LE的BOM为FF FE,UTF16BE的BOM为FE FF,UTF8的BOM为EF BB BF,但是一般不建议UTF8文件带BOM。
Utf-8
UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。
UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
TF-8 的编码规则很简单,只有二条:
1)对于单字节的符号,字节的第一位设为0
,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
2)对于n
字节的符号(n > 1
),第一个字节的前n
位都设为1
,第n + 1
位设为0
,后面字节的前两位一律设为10
。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
下面,还是以汉字严
为例,演示如何实现 UTF-8 编码。
严
的 Unicode 是4E25
(100111000100101
),严
的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx
。然后,从严
的最后一个二进制位开始,依次从后向前填入格式中的x
,多出的位补0
。这样就得到了,严
的 UTF-8 编码是11100100 10111000 10100101
,转换成十六进制就是E4B8A5
。
其他几种编码格式
1)ANSI
是默认的编码方式。对于英文文件是ASCII
编码,对于简体中文文件是GB2312
编码(只针对 Windows 简体中文版,如果是繁体中文版会采用 Big5 码)。
2)Unicode
编码这里指的是notepad.exe
使用的 UCS-2 编码方式,即直接用两个字节存入字符的 Unicode 码,这个选项用的 little endian 格式。
3)Unicode big endian
编码与上一个选项相对应。我在下一节会解释 little endian 和 big endian 的涵义。
4)UTF-8
编码,也就是上一节谈到的编码方法。
参考
https://www.cnblogs.com/tarol/p/7523642.html
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
深入编解码:ASCII,UNICODE,UTF8等的更多相关文章
- 浅显总结ASCII Unicode UTF-8的区别
如果觉得此地排版不好,欢迎访问我的博客 浅显总结ASCII Unicode UTF-8的区别 制作表单时,为了追求更好的用户交互体验,常常会有提示性的内容,比如提醒用户字符的限制.由于英文,中文字符的 ...
- 字符编码 ASCII unicode UTF-8
字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(b ...
- 【转】【编码】ANSI,ASCII,Unicode,UTF8之一
不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称 ...
- ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别(转载)
原文出处:http://www.blogjava.net/xcp/archive/2009/10/29/coding2.html 最近老为编码问题而烦燥,下定决心一定要将其弄明白!本文主要总结网上一些 ...
- ASCII, UNICODE, UTF-8, 字符集理解
字符编码的发展历史 一个字节:最初一个字节的标准是混乱的,出现过4位.6位.7位的一字节标准,最终由于历史原因和物理存储需求(8位是2的3次方,方便物理存储),所以采用了8位为一个字节的标准. ASC ...
- ascii unicode utf-8 url编码
ascii 编码 计算机内部,所有信息最终都是一个二进制值 上个世纪60年代,美国制定了一套字符编码ascii ascii 编码就是定义:英语字符与二进制位之间的关系 unixcs unicode编码 ...
- 【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC ...
- python中,ascii,unicode,utf8,gbk之间的关系梳理
在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人 ...
- 关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题.这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助. 还是得从ASCII码说起 说到字符编码,不得不说ASCII ...
随机推荐
- Zookeeper概念学习系列之分布式事务
不多说,直接上干货! 初学者来说,肯定会有这么一个疑问.为什么会在zookeeper里牵扯到分布式事务? zookeeper到底是什么? zookeeper实际上是yahoo开发的,用于分布式中一致性 ...
- emacs 配置 clojure
安装JDK,Version >= 6.0 java -version 2 安装EMACS,Version>=24 在脚本~/.emacs.d/init.el中增加如下内容 (require ...
- 关于数据库NULL值的几个问题思考
最近在写项目,拼接SQL时,发现好多关于NULL值的问题,现在把这些问题整理出来,以供日后参考. 对于Oracle数据库: 一.排序 Oracle对于null值的排序,有一个函数可以进行操作: 在默认 ...
- ubuntu 64上的GCC如何编译32位程序
运行命令 gcc -v 显示: Target: x86_64-linux-gnu 所以,我这里的gcc默认生成64位的程序. 如果想编出32位的程序,就要加 -m32选项.可是我尝试了,还是不行. 原 ...
- sharding-jdbc集成spring+mybatis分表分库
maven: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http ...
- java设计模式之桥梁模式(Bridge)
1.桥梁模式 与 策略模式 非常相似 (其实很多设计模式都相似,因为所有的模式都是按照设计原则 而设计出来的,设计原则就相当于武功的心法,设计模式就是招式,只要心法过硬,就可以无招胜有招了.) 这里也 ...
- c#,利用WPF的ScaleTransform和TranslateTransform实现图片的缩放效果
一.缩放要求 1.缩放对象在可视区域内,已对象的中心点进行缩放. 2.缩放对象比可视区大,并且对象各边界都在可视区外围,那么已鼠标位置进行缩放. 3.缩放对象比可视区大,但是缩放后某一边界在可视区的对 ...
- 比较2个文件内容不同行的shell脚本
第一种:grep命令法 命令如下:grep -vxFf file1 file2 > a.txt 其中file2是大文件,file1是小文件 第一种:comm命令法 命令如下:comm file ...
- [转]ORA-00979: not a GROUP BY expression报错处理
本文转自:http://blog.itpub.net/29154652/viewspace-772504/ 环境:Oracle Database 11gR2(11.2.0.2) on Linux 故 ...
- php多进程实现 亲测
php多进程实现 PHP有一组进程控制函数(编译时需要–enable-pcntl与posix扩展),使得php能在nginx系统中实现跟c一样的创建子进程.使用exec函数执行程序.处理信号等功能. ...