提到utf-8,脑海里立马出现了Unicode。那什么是utf-8, 什么是Unicode呢?简要说一下。

Unicode(Universal Multiple-Octet Coded Character Set,UCS) 是由国际组织设计,可以容纳全世界所有语言文字的编码方案。

utf (UCS Transformation Format ) 是实现Unicode的方法,utf-8 就是其中一个(以8位作为一个编码单元)版本。另外还有utf-16(16位为一个编码单元),utf-32(32位为一个编码单元)

OK,现在先不说这些太专业的东西。用数的表示来说,

想想,如果我们的前辈们规定,0要写成0000,3要写成0003,50要写成0050……

你是不是觉得很蛋疼?很费事?直接表示成0,3,50……方便省事

utf-8就是做了这么一件事。把8位以内能表示的Unicode编码用一个字节表示,16位以内能表示的Unicode编码用两个字节表示,同理,24位3字节,32位4字节

但是,计算机存储数据是连续的二进制数0,1表示的,比如:10111011001001100000111010111100001110……

天晓得你哪里是8位一个字符,哪里是16位一个字符……

utf-8就提供了一种用连续的0,1表示,还能区分1字节、2字节,3字节、4字节的处理方案。

看图(截图来自:https://www.ietf.org/rfc/rfc3629.txt):

上图表示了字符编码对应的utf-8二进制表示,可见规则如下:

单字节字符(比如ASCII对应字符):最高位用0表示

多字节字符(比如中文字符):第一个字节用n个1 表示,后面字节前两位为10    n表示该字符的字节数

这么一来就可以以字节为单位处理数据了(自己想象的,只为理解处理过程,实际未必真是这样):

1、取出一个字节

2、如果该字节的最高位是0,按单字节字符处理,找到对应Unicode编码。转1;否则,转3

3、识别该字节前面有几位1,记为n,向后再取n-1个字节,找到以这n个字节表示的数对应的编码。转1

注意:上图中的二进制数中,只有xx表示的部分才是Unicode码,其它都是标志)

总结:Unicode是一个能表示世界上所有语言的编码集合;utf-8是一种Unicode实现方式。

想要了解更多详情,请参考:

UTF-8编码规则

简单说说utf-8编码格式的更多相关文章

  1. Redis 协议为例谈简单的协议分析

    怎样去研究一个协议的过程,协议的格式,好处,怎么样模拟发包等,下面是一个简单的过程记录. 研究的步骤: 协议相关的资料,RFC,官方文档等.弄清楚协议工作在4层还是7层,是二进制还是文本协议等 抓包, ...

  2. csvkit---python一个牛逼到不行的csv处理库

    先吐槽一下:不管是百度还是谷歌,查来查去除了官方文档之外就没有任何可以借鉴的例子,虽然官方文档写的挺好的.但是我一直以为是在python语言的方式运行的,结果是以命令行的方式运行的,搞得我还以为这个库 ...

  3. java常见字节大小存储问题

    JAVA中默认的编码方式 转:http://blog.csdn.net/scyatcs/article/details/31356823 编码问题存在两个方面:JVM之内和JVM之外.1.Java文件 ...

  4. 码表 Unicode GBK UTF8 示例

    Unicode的编码形式与对应的字符串相互转换 /**  * Unicode的编码形式与对应的字符串相互转换  * @author 白乾涛  */ public class UnicodeUtils  ...

  5. Servlet中的乱码问题及解决办法

    假设现在有个form表单,当页面中提交一个包含中文的请求时,在服务端有可能出现中文乱码问题. <!DOCTYPE html> <html> <head> <m ...

  6. Jekyll 解决Jekyll server本地预览文章not found的问题

    layout: post tags: [Jekyll] comments: true 执行Jekyll本地浏览器预览指令 bundle exec jekyll serve 进入浏览器输入127.0.0 ...

  7. 金九银十,收下这份 Java String 面试题

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭 ...

  8. javaCV开发详解之7:让音频转换更加简单,实现通用音频编码格式转换、重采样等音频参数的转换功能(以pcm16le编码的wav转mp3为例)

    javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...

  9. H.264编码格式简单分析

    H.264的重要性不再提了.本文主要记录一下H.264的编码格式.H.264官方文档:https://github.com/jiayayao/DataSheet/tree/master/encode- ...

随机推荐

  1. java 网络文件下载(并命中文名)

    public void download(HttpServletRequest request, HttpServletResponse response){ //获取服务器文件 String fil ...

  2. requests_html使用asyncio

    import asyncio import functools from concurrent.futures.thread import ThreadPoolExecutor from reques ...

  3. MySQL-UDF和MOF提权

    MOF提权 MOF文件是mysql数据库的扩展文件(在c:/windows/system32/wbem/mof/nullevt.mof) 叫做”托管对象格式”,其作用是每隔五秒就会去监控进程创建和死亡 ...

  4. ios真机调试教程(不上架App Store安装到手机)

    原文 不上架App Store安装到手机调试测试,需要用到ios真机调试证书打包的ipa才能安装到非越狱的手机使用. 2017年最新整理的ios真机调试的详细图文步骤流程,轻松的把你开发的ios ap ...

  5. Java实验报告(一)

    Java实验报告(一) 实验过程 1. 打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个" ...

  6. Arcengine获得arcgis安装的版本

    ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Version  //gsioracle MessageBox.Show(ESRI.ArcGIS.RuntimeMan ...

  7. sentinel控制台监控数据持久化【MySQL】

    根据官方wiki文档,sentinel控制台的实时监控数据,默认仅存储 5 分钟以内的数据.如需持久化,需要定制实现相关接口. https://github.com/alibaba/Sentinel/ ...

  8. springboot 底层 JackSon 的使用

    Jackson常用的注解使用和使用场景: 接下来我们在看一段代码,这段代码是常用注解在实体类User中的简单使用:package zone.reborn.springbootstudy.entity; ...

  9. react+laravel与服务端渲染的几点思考

    一.前后端完全分离 1.用React.js做MVC中的V,剩下的交给Laravel 2.Laravel用来做API接口开发. 3.好处:实现了前后端开发的分离,从而加快前后端开发效率.另外若是多端的如 ...

  10. JS中map()与forEach()的用法

    相同点: 1.都是循环遍历数组中的每一项 2.每次执行匿名函数都支持三个参数,参数分别为item(当前每一项),index(索引值),arr(原数组) 3.匿名函数中的this都是指向window 4 ...