现有的UTF-8和UTF-16,用不同语言表示相同意思时,字节数相差很多。所以,就有了UTF-64的设想。它的设计目标是:不同语言表示相同意思,需要的字节数相差不多。
运行以下程序,得出所有排列组合。
import itertools as it
a=set()
b=(7,8,10,13,16,21)
for i in range(1,8):for x in it.product(b,repeat=i):if sum(x)<=52:a.add(x)
for x in sorted(a):print(x)
print(len(a),len(str(bin(len(a))))-2)
[7 8 10 13 16 21],sum(x)<=52
3519, 12bit, 12+52=64bit
运行结果:
11 -> (21, 10, 10)
4 -> (21, 10, 10, 7)
3 -> (21, 10, 10, 8)
1 -> (21, 10, 10, 10)
8 -> (21, 10, 13)
1 -> (21, 10, 13, 7)
0 -> (21, 10, 13, 8)
5 -> (21, 10, 16)
0 -> (21, 10, 21)
18 -> (21, 13)
11 -> (21, 13, 7)
4 -> (21, 13, 7, 7)
3 -> (21, 13, 7, 8)
1 -> (21, 13, 7, 10)
10 -> (21, 13, 8)
3 -> (21, 13, 8, 7)
2 -> (21, 13, 8, 8)
0 -> (21, 13, 8, 10)
8 -> (21, 13, 10)
1 -> (21, 13, 10, 7)
0 -> (21, 13, 10, 8)
5 -> (21, 13, 13)
2 -> (21, 13, 16)
15 -> (21, 16)
8 -> (21, 16, 7)
1 -> (21, 16, 7, 7)
0 -> (21, 16, 7, 8)
7 -> (21, 16, 8)
0 -> (21, 16, 8, 7)
5 -> (21, 16, 10)
2 -> (21, 16, 13)
10 -> (21, 21)
3 -> (21, 21, 7)
2 -> (21, 21, 8)
0 -> (21, 21, 10)
3519 12
标志长度选择[7 8 10 13 16 21],原因是用52除以7,商7,即第一个元素;用52除以6,商8,即第二个元素;……;最后,52除以2,商26,unicode最大到21,所以写下21。用52除以3,商17,凑整到16。
上述程序计算了标志长度的不同排列组合,它们加起来,长度小于等于52;而用于描述这些排列组合的数字,不大于3519,占12比特;52+12=64,这是又一个UTF-64方案。
例:存储字符串"设计UTF-64方案",52-16-16-7-7=6,前边的"设计UT"储存于一个64比特之中,并浪费6比特,使用模板(16, 16, 7, 7)。
之后的7+7+7+7+16=44,对应于"F-64方",存储于第二个64比特。
最后一个字,“案”,存储于一个64比特中。
最后,64位全零表示字符串结束。
以64比特为单元存储字符串,每一个64比特,都包括M C
两部分。M占12比特,表示上述排列组合中的一个;C占52比特,记录着字符的信息。UTF-64的设计目标,是不同语言表示相同意思,需要的字节数差不多。现在,它可以在64比特里存储7个ASCII字符,或3个汉字。考虑到语言的特性不同,尚未做到字节数一样,但至少向前迈出了一步。