是否有UTF-8编码中未使用的字节?

时间:2015-05-04 08:25:38

标签: unicode binary

据我所知,UTF-8是ascii的超集,因此包含了不用于表示可打印字符的控制字符。

我的问题是: UTF-8编码没有使用任何字节(256种不同)吗?

我想知道你是否可以 UTF-8文本转换/编码为二进制文件。

这是我的过程:

我不知道utf-8文本编码是如何工作的,以及它如何使用这么多字符(只是它为不在ascii中的字符使用多个字节(latin-1 ??))但是我知道ascii文本是在utf-8中有效,因此utf-8编码不会使用control characters (bytes 0-30),但它们同时不用于显示字符,对吧?

所以256个不同的字节仅使用~230。对于1000(二进制)长的unicode文本,只有1000 ^ 230个不同的文本?对了

如果确实如此,您可以转换为小于1000字节的二进制数据。

Wolfram alpha 1000 bytes of unicode (assumption unicode only uses 230 of the 256 different bytes) --> 496 bytes

3 个答案:

答案 0 :(得分:2)

0xF8-0xFF在UTF-8的任何地方都无效,其他一些字节在某些位置无效。

字符的前导字节表示用于对字符进行编码的字节数,每个连续字节都有10作为其两个高位。这样您就可以选择文本中的任何字节并找到包含它的字符的开头。如果你不介意失去这种能力,你当然可以提出更有效的编码。

答案 1 :(得分:2)

您必须区分字符 Unicode UTF-8编码

在ASCII,LATIN-1等编码中,一个字符与0到255之间的一个数字存在一对一的关系,因此一个字符可以由一个字节编码(例如" A" - > 65)。要解码这样的文本,你需要知道使用了哪种编码(65真的意思是" A"?)。

为了克服这种情况, Unicode 为每个字符(包括各种特殊内容,如控制字符,变音符号等)分配一个0到0范围内的唯一编号。到0x10FFFF(所谓的 Unicode codepoint )。由于此范围不适合一个字节,因此问题是如何编码。有几种方法可以做到这一点,例如最简单的方法总是为每个字符使用4个字节。由于这会消耗大量空间,因此更有效的编码是UTF-8:此处每个 Unicode代码点(= Character )都编码为一,二,三或四bytes(对于此编码,并非使用0到255之间的所有字节值,但这只是技术细节。)

答案 2 :(得分:1)

是的,可以设计比UTF-8更节省空间的编码,但你必须权衡优势和劣势。

例如,如果您的主要目标是(例如)ISO-8859-1,您可以将字符代码0xA0-0xFF映射到它们自己,并且仅使用0x80-0x9F来选择扩展地图,有点模糊地像UTF-8使用(几乎)所有0x80-0xFF编码可以代表所有Unicode的序列> 0x80的。当大部分文本不使用0x80-0x9F或0x0100-0x1EFFFFFFFF范围内的字符时,您将获得显着优势,但如果不是这样,则会相应丢失。

或者您可以要求用户保留一个状态变量,该变量告诉您​​当前选择了哪个字符范围,并使流中的每个字节充当该范围的索引。这有很大的缺点,但过去常常是这样做的(见证如ISO-2022)。

Ken Thompson和Rob Pike之前的原始UTF-8草案可能比最终规范更节省空间,但他们引入的变化具有一些非常有吸引力的属性,交易(我假设)一些空间效率缺乏语境歧义。

我建议您阅读Wikipedia article about UTF-8以了解设计需求 - 只需几分钟即可掌握规范,尽管您可能需要预留一小时或更长时间才能遵循脚注等(汤普森的轶事目前是脚注#7。)

总而言之,除非您正在从事太空旅行或类似效率密集型应用,否则失去UTF-8兼容性可能不值得您花费时间,现在就应该停止。