专栏首页明丰随笔UTF8变长编码

UTF8变长编码

首先要说明的是我们所有的信息都是以二进制字节的形式保存的,比如00000000这样的8个0就代表一个字节了。

1个字节一共有256中变化,不能用来表示我们大千世界的所有文字,(想想中文就知道了)。

所以为了能有一种编码表示所有语言的文字,那我们就得加长位数,比如全世界有256*256*256*256个不同的文字,那么我们就得用4个字节的二进制来表示。

说英语的国家就吃亏了,因为他们明明用一个字节就能表示一个字母,却因为要配合我们,要用好四个字节表示一个字母,保存字母的硬盘会白白浪费了大量了空间。

怎么解决这个问题?

UTF8变长编码可以解决。有的文字是1个字节存储的,有的文字是2个字节存储的,还有3个字节存储的,还有4个字节存储的。

最后集合起来就是一共有一到四字节四种变长的编码。

一字节:0*******

两字节:110*****,10******

三字节:1110****,10******,10******

四字节:11110***,10******,10******,10******

就是这四种情况。相信你已经知道我们怎么来判断一个字是几字节的了。

如果是以0开头的,那么他就是一个1字节编码,取到它一字节的数据去一字节表中找就OK了。

如果是以110开头的,那么它就是一个2字节编码,取到它两字节的数据去两字节表中找就OK了,而且它的第二个字节一定要是10开头,不然就是乱码了。

后面类推。

核心之处就是:

把0,110,1110,11110这4种比特用在不同的位置而区分开不同长度的编码.

把10这个比特用来连接多字节字符之间的多个字节。

还有一点要说明,就是一个UTF8格式的文件,它要表明它的身份,以让人用UTF8的读法来读它。

可能我们仔细的看一下这个文件的内容,看一下字节出现个格式,和我们上面所说的是否一样,也就知道它是不是UTF8编码了。

不过还有一种保险一点的方法,就是在文件的最开头加上三个字节的信息,这三个字节比较少见,所以一见到它们三个开头,我们就知道是UTF8格式的文件了,使用这种方式可以让我们快速判断出来文件是不是UTF8格式的,有助于提高性能,不过这不是必须的,我们没有这三个字节也可以判断文件的格式是不是UTF8编码方式。

比如UltraEdit这个强大的工具,我们可以用它查看16进制,你可以试试建立一个文本,然后用16进制模式打开,记一下它开头的几个字节,然后保存为UTF8,再看一下前几个字节,就会发现多了三个字节。这就是刚才说的头,它的学名叫BOM。

这三个字节分别是:EF BB BF

本文分享自微信公众号 - 明丰随笔(liumingfengwx2),作者:刘明丰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈BASE64编码

    很多人都以为编码(Encoding)和加密(Encryption)是同一个意思。编码和加密都是对格式的一种转换,但是它们是有区别的。编码是公开的,比如下面要介绍...

    小蜜蜂
  • 浅谈消息队列 1

    消息队列,一般我们会简称它为MQ(Message Queue),嗯,就是很直白的简写。

    小蜜蜂
  • 浅谈散列运算

    “指纹”一词形象地描述了散列运算的结果。在现实生活中,两个人可能长得很像,但是他们的指纹不同,根据指纹就能对这两个人进行区分。

    小蜜蜂
  • 理解字节序

    1. 计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。 举例来说,数值0x2211使用两个字节储存...

    ruanyf
  • 字节和字符

    位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数。

    泰斗贤若如
  • 脑残式网络编程入门(九):面试必考,史上最通俗大小端字节序详解

    最近在从头重写 MobileIMSDK 的TCP版,自已组织TCP数据帧时就遇到了字节序大小端问题。所以,借这个机会单独整理了这篇文章,希望能加深大家对字节序问...

    JackJiang
  • mysql 数据类型及占用字节数

    秋日芒草
  • 刨根究底字符编码之九——字符编码方案的演变与字节序

    前文已经提及,编号字符集CCS(简称字符集)与字符编码方式CEF(简称编码方式)这两个概念,在早期并没有必要严格区分。

    用户1876609
  • 字符与字节有什么区别呢?

    1、计算机存储信息的最小单位,称之为位(bit),音译为比特,二进制的一个“0”或一个“1”叫一位。 2、计算机存储容量基本单位是字节(Byte),音译为拜特...

    黑泽君
  • 计算机编码基础

         乱码是我们在日常的工作中经常遇到的问题,你可能从网上好不容易下载了一个炫酷的jQuery插件,但是却在打开的时候,发现某几个js文件都是类似“澶у0?...

    Single

扫码关注云+社区

领取腾讯云代金券