为什么UTF-8编码的文件,开头都是 EF BB BF ?

发布于 2022-06-01 22:07

UTF-8 编码早已成为了当今互联网最为重要的编码之一,几乎在所有正儿八经的网页中,都会看到这么一段:


charset="UTF-8"


如果要讨论 UTF-8 ,我们就需要先聊一聊与它息息相关的的 Unicode 。


  • Unicode



Unicode 定义了一个字——当然绝对不仅是汉字,而是全世界任何语言中的某个字或字母——所对应的十六进制数是多少。比如"中"字,对应的数字是 4E2D ,在 Unicode 中,用 U+4E2D 表示,其中 "U+" 用来说明这串数字是 Unicode 编码。而 4E2D 这串(十六进制)数字则有其对应的术语 —— 在 Unicode 中,称之为 码点 (codepoint) 。


  • UTF-8


UTF-8 则是码点以二进制的形式,保存成字节时,根据特定规则,以字节的方式,所呈现的 16 进制值。如果这个时候仔细思考一下,读者可能就会说了:你要不要听听看你在说些什么?把 4E2D 这个十六进制转换成计算机能理解的二进制进行保存,然后把保存在计算机中的二进制,再转换成十六进制,就得到了 UTF-8 编码。那我还专门搞一个 UTF-8 编码干嘛?不就是 Unicode 中定义的 4E2D 么?这个问题问非常好,它也就是这篇文章所要解释的重点。究其原因,不得不再重申一下 Unicode 的惊人优势:它把世界上所有的语言中的字或字母,都做了码点定义!甚至是 emoji 表情!


我国的“中华字库”工程曾经统计的汉字约有10万个。我们看到形如 4E2D 这样的码点,才 4 个 16 进制数,撑死 16 的 4 次方,最多只能放 65536 个字,连所有汉字都放不下,还要放全世界的字符?还要放 emoji ?而且码点的定义还在不断增加?这怎么能做得到呢?其实,并不是我在瞎说,也不是 Unicode 在说大话。而是我们常见的码点大多是这样 4 个 16 进制数,但并非码点只能是 4 个 16 进制数。比如 "

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材