UTF-8是一种以可变宽度格式编码Unicode代码点的相对简单的方法,这样它就不会轻易混淆不了解Unicode的代码。
UTF-8概述
- 字节通常在1-0x7F(含)范围内
- 具有位模式
10XX XXXX
的字节被视为连续字节,其中六个最低有效位用于编码部分代码点。除非前一个字节期望它们出现,否则它们不得出现。 - 具有模式的
110X XXXX
字节之后需要一个连续字节 - 具有模式的
1110 XXXX
字节之后需要两个连续字节 - 具有模式的
1111 0XXX
字节之后需要三个连续字节 - 所有其他字节均无效,并且不应出现在UTF-8流中的任何位置。5、6和7字节的簇在理论上是可能的,但出于此挑战的目的而不允许。
超长编码
UTF-8还要求用最少的字节数表示一个代码点。可以用更少的字节表示的任何字节序列都是无效的。修改后的UTF-8向其中添加了一个例外,即空字符(U + 0000),应将其表示为C0 80
(十六进制表示),并且不允许空字节出现在流中的任何位置。(这使其与以null终止的字符串兼容)
挑战
您将要编写一个程序,当给定一个字节字符串时,该程序将确定该字符串是否表示有效的Modified UTF-8,如果有效,则返回真实值,否则返回假值。请注意,您必须检查超长编码和空字节(因为这是Modified UTF-8)。您不需要解码UTF-8值。
例子
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
规则
- 适用标准规则和漏洞
- 输入和输出可以采用任何方便的格式,只要可以读取无符号字节范围(0-255)中的所有值即可。
- 您可能需要使用数组或文件,而不是使用以空字符结尾的字符串。您需要能够读取空字节。
- 最短的代码胜出!
- 请注意,不能保证使用内置函数解码UTF-8符合此处给出的要求。您可能需要解决它并创建特殊情况。
编辑:由于不使用解码UTF-8的内置函数而增加了奖励
EDIT2:删除了奖金,因为只有Rust答案合格,并且定义起来很尴尬。