如果你看一下显示UTF-8字节布局的table here,它看起来很浪费!
一个6字节的字符有17个硬编码位!如果我们只是将每个字节的第一位设置为1
以指示"则下一个字节是同一个字符的一部分"那么我们只需要6位:
1xxxxxxx 1xxxxxxx 1xxxxxxx 1xxxxxxx 1xxxxxxx 0xxxxxxx
和它仍然向后兼容ASCII! 和我们也不会被限制为6个字节。
那么为什么UTF-8会浪费?当然,我必须有理由不去看。此外,在第一个字节中似乎有足够的信息,我们甚至不需要在每个剩余字节上使用10
标头。我们本可以做到
0xxxxxxx
10xxxxxx xxxxxxxx
110xxxxx xxxxxxxx xxxxxxxx
1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx
11110xxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
11111xxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
这也会奏效,不是吗?或者我们可以用不同的方案支持更多的字节。
如果UTF-8没有得到适当的支持,是否与单个字节的显示有关? 10
能提供什么?权衡取舍值得吗?如果我尝试在一个只有ASCII的程序中渲染UTF-8编码的日文字符,那么我会不会得到垃圾?
答案 0 :(得分:3)
这种冗余的原因是使UTF-8自同步:由一个码字的一部分或任何两个相邻码字的重叠部分形成的符号流不是有效的码字。请参阅https://en.wikipedia.org/wiki/Self-synchronizing_code和https://en.wikipedia.org/wiki/UTF-8#History