基地65536

2020-09-20 14:43:23

Base65536是针对UTF-32编码文本优化的二进制编码。(对于通过Twitter传输数据,Base65536现在被认为是过时的;请参见Base2048。)。这个JavaScript模块base65536是这种编码的第一个实现。

Base65536仅使用安全的Unicode代码点-没有未分配的代码点、没有空格、没有控制字符等。

*最多280个Unicode字符进行Twitter复杂的权重计算。列出†Base85是为了完整,但所有变体使用的字符都被认为在文本中一般使用是危险的:转义字符、方括号、标点符号等。‡Base131072是一个正在开发中的工作,还没有准备好全面使用。

导入{encode,decode}from';base65536';const uint8Array=new Uint8Array([104,101,108,108,111,32,119,111,114,108,100])const string=encode(uint8Array。缓冲区)控制台。Log(String);//6个码点,';驨ꍬ啯𒁷ꍲᕤ';const uint8Array2=new Uint8Array(DECODE(String))控制台。Log(Uint8Array2);//[104,101,108,108,111,32,119,111,114,108,100]。

Base65536接受并返回Uint8Array。请注意,每个Node.js缓冲区都是一个Uint8Array。Uint8Array可以转换为Node.js缓冲区,如下所示:

对Uint8Array进行编码并返回Base65536字符串,该字符串适合通过几乎任何Unicode-CLEAN文本处理API进行安全传递。此字符串不包含特殊字符,不受Unicode规范化的影响。该字符串为每个码位编码两个字节。

HATETRIS有四个按钮:左、右、下和旋转。因此,HATETRIS中的一个动作就编码了两个比特的信息。虽然HATETRIS游戏可以扩展到任意击键次数(只需永远按下旋转键),但通常情况下,游戏持续的时间越长,得分就越高。2015年末,当Base65536首次开发时,HATETRIS回放(30分)的世界纪录是1440次击键=2880位长,HATETRIS回放被编码为十六进制,每个十六进制数字编码4位=2次击键,为了清晰/易读添加空格,然后显示为文本,如下所示:

C02A AAAA AAAB 00AA AAAA AC08 AAAA AAC2 AAAA AAAA C2AA AAAA AEAA AAAA AA56AAAA AAAA B55A AAAA AA96 AAAA AAAA D5AA AAAA A9AA AAAA AAB5 AAAA AAAA AAAAAAAA DAAA AAAA 9756 AAAA AA8A AAAA AAAB AAAA AAAB 5AAA AAAB 56AA AAAA AAAAA82A AAAA B00A AAAA A6D6 AB55 6AAA AAA9 4AAA AAA6 AAAA AD56 AAAA B56A AAAA032A AAAA A65B F00A AAAA AA6E EFC0 2AAA AAAA EB00 AAAA AAA8 0AAA AAAA 802AAAAA AA54 AAAA AAA1 AAAA AAA0 AAAA AAA0 0AAA AAAA C02A AAAA B002 AAAA B00AAAAC 2AAA AAB0 AAAA AEAA AAA9 5AAA AAA9 D5AA AAA5 AAAA AAB5 6AAA A6AA AAAB5AAA AAAA AAAA DAAA AAD5 56AA AA2A AAAA BAAA AAD6 AAAB 56AA AAAA 82AA AC02AAA7 B5AA D556 AAAA 52AA A6AA B55A AB56。AA80 FCAA AAA5 583F 0AAA A9BB BF00AAAA AE80 32AA AA82 FAAA A802 AAAA 96AA AA1A AAA8 2AAAA A00A AAAB 00AA AB00AAB0 AAAB 0AAB AA9 5AAA AD56 AA5A AAB5 6AAC 02A9 AAAB 5AAA AAD AAB5 5AA2AAAE AA0A AAB2 AAD5 6AB5 AA02 AA0 AA0A55A AD6A BAAC 2AAB 0A0 C2AA C02A

这是包括空格在内的899个字符,如果删除空格,则为720个字符。如果将十六进制字符转换为二进制,则将有360个字节,如果以base64表示,则将有480个字符。这使得通过Twitter分享回放变得不切实际,当时Twitter只支持最多140个字符的Tweet。

使用基本游程长度编码,使用两位击键和两位游程长度,重放缩小到2040位,即255字节,即340个Base64字符。但那仍然太大了。

然而,有趣的是,Tweet长度是由文本的NFC标准化版本中的码点数量来衡量的,而不是通过计算文本的任何特定编码中的字节数来衡量的。意识到这一点,我开发了Base65536。Base64对每个Unicode代码点仅编码6位,每个Tweet的潜在最大值为105个字节,而Base65536对每个Unicode代码点编码16位,从而大大改进了每个Tweet的280个字节。

将255字节的游程长度编码重放表示为Base65536,我们得到一个长度为128个码位的字符串:

𡊻𣹫𤅋𤇅𣾻𤇄𓎜𠚻𤊻𢊻𤉛𤅫𤂑𤃃𡉌𤵛𣹛𤁐𢉋𡉻𡡫𤇠𠞗𤇡𡊄𡒌𣼻㢸𠞻𠦻𡊻𣈻𡈻𣈛𡈛ꊺ𠆼𤂅𣻆𣫃𤮺𤊻𡉋㽻𣺬𣈛𡈋𤭻𤂲𣈻𤭻𤊼𢈛𤇃𢊻𤄻嶜𤄋𤇁𡊻𤄛𤆬𠲻𤆻𠆜𢮻𤆻ꊌ𢪻𤆻邌𤆻𤊻𤅋𤲥𣾻𤄋𥆸𣊻𤅛ꊌ𤆻𤆱炼綻𤋅𤅴薹𣪻𣊻𣽻𤇆𤚢𣺻赈𤇣綹𤻈𤇣𤾺𤇃悺𢦻𤂻𤅠㢹𣾻𤄛𤆓𤦹𤊻𤄰炜傼𤞻𢊻𣲻𣺻ꉌ邹燉𣼋𦄘炸邹儛𡈛ᔺ。

这很适合一条推文,只剩下12个字供评论。当然,更糟糕的HATETRIS玩家通常会以较短的回放结束,留下更多的谩骂空间。

上述30点的纪录是在2010年5月4日创下的。2017年6月6日,该纪录以31分的成绩被打破,Base65536重播:

𤂻愈䲻㰋𣻋㼘𤇀𠞻𤇋傜𣾻𤇋𤆦𠪵𤃄遈肼𡮻𤆻絈𤇄𤆴𥆹𤅛𤆻𤺸𤅋𤄋𥆺𠞻𤆻𥆐𠪻𠪄𤇄𣺁𤄋𡪄郈𢪻𤇄㲸㰈𤄋𤊁𤂻𤄜𡪼𣢻𡊀𣺻丘𤇋𤩘𣾻𥄈𠪻𤃋㰈𤀛蹌𤅋𤄋𡚡𤇋𤀜緊𣥋𤆜𤆁𠲼綹𥅘𣹋䰉𣼋蹊𤽋𤅋𤆌𤆰𡚡䲻𤇂𤆤𡪥𣚻𣢻𠮤𤺸𤅋𤂄𡘜羹𤇆㾸㶹𤀌𢙛𡞐𤆌㶺𥄩𡮴㺻𣣋𤃋𣛋𥆀𤺦ꉊ𣛄𠚀𠚜𤆀职𢊻徻蹈𢫄。𣾻𤄌𤛋𡛁𡫋羌𡏋㼈𢢌𢢬𥂐𡫅𣪄𡊤肻𣊐㼸𢪠𢪄䂸𡪄趜𥀩𡙋𢢀𡊀𣺆㼩𤂄𡫇𡪴䲹𥄉𨂀

2017年晚些时候,Twitter将推文的最大长度从140个Unicode代码点增加到280个Unicode代码点…。除了代码点U+1100朝鲜文CHOSENG KIYEOK以上现在算作双倍。这有效地将Unicode划分为轻码点和重码点。由于Base65536只使用较重的代码点,因此新的Long&34;Tweet最多只能包含140个Base65536代码点,即280个字节。

这两件事促使我为新的Long Twets开发了一种新的二进制编码,Base2048。使用Base2048,一条推文最多可以容纳385个字节。之前不可推特的记录31分重放变成:

௨ഖƌݯߜࠏІWƑsໃa௨೯ܘݷಳජଈیԪؼʥݺԥඞܘݲࠐڄໂঅமةໃݹ௧ړІٽ௨൞ໃZ௨ಘІܥࠐΣІZߜටȜখذජНݹߛeʛݹߤปເѧ௩ԚໂՉࢸටuа௨સȣݷłقෆঅਏeܘԔצقషݸɢڠຜঀಧҸມѧஐට༪൩ԊಅഫܡथsถԡԦԚໃɥஸقࡈɕɠɈไݸצقషݰਵϺФঅஓػݐɓԞуຯɕझࡈ๐ݞझࢶІݞमปദஈƉؿଭݪஸҩЂ൸ԛمϦGƁҨVھԥචЅշࡂ෮लݷƘණ。໘ࠅƘಧНקࢻҨฆӘದԋϝପࠑ੧ͳݲடփරݞਵΚϼɢԒԺٳѦԤࠌξGಘسਯܥஶҋϮτथlϼʔ。

Base2048遗憾地使Base65536过时,因为它最初的预定目的是通过Twitter发送二进制数据。现在使用Base2048而不是Base65536来渲染HATETRIS回放。

然而,Base65536仍然是通过基于文本的系统发送二进制数据的最先进技术,该系统简单地计算Unicode代码点,特别是那些使用固定宽度UTF-32编码的代码点。

Unicode有1114112个代码点,其中大部分我们没有使用过。我们能走得更远吗?

要为每个码点额外编码一个比特,我们需要将使用的码点数量增加一倍,从65,536个增加到131,072个。这将是一种新的编码,Base131072,其UTF-32编码效率为53%,而Base65536的UTF-32编码效率为50%。(请注意,在UTF-16中,Base32768的性能明显优于这两种选择,而在UTF-8中,Base64仍然是首选。)。

但是,从Unicode 10.0开始,安全码点总共只返回116,813个安全码点。也许Unicode的未来版本最终会分配更多字符并使其成为可能,但即使最终发生这种情况,看起来也不太可能将字符整齐地排列在256个块中,这使得Base65536变得如此小而简单。这可能不值得你费心..。