对于Unicode字符串而不是base64具有base = 64,编码基数的限制是多少?

时间:2016-01-24 23:01:06

标签: unicode encoding language-agnostic

这实际上与代码高尔夫有关,但也适用于其他地方。 人们通常使用base64编码在源代码中存储大量二进制数据

假设所有编程语言都乐于阅读Unicode源代码,我们可以可靠地设计baseN编码的最大N是多少?

这里的可靠性意味着能够对任何数据进行编码/解码,因此可以对输入字节的每个组合进行编码,然后进行解码。编码的表格不受此规则的约束。

主要目标是尽量减少字符数,无论字节数

它是base2147483647(32位)吗?

另外,因为我知道它可能因浏览器而异,并且我们已经遇到了将codegolf的代码复制粘贴到编辑器的问题,因此复制粘贴功能也是一个因素。我知道有一个Unicode范围的字符没有显示。

注意: 我知道对于二进制数据,base64通常会扩展数据,但这里的字符数是主要因素。

1 个答案:

答案 0 :(得分:3)

这实际上取决于您希望编码的可靠的方式。字符编码的设计需要权衡,一般来说,允许的字符越多,普遍接受的可能性就越小,即可靠性越低。 Base64对此无法免疫。 {2003}发布的RFC 3548提到区分大小写可能是一个问题,并且字符+/在某些情况下可能会出现问题。它将Base32(无小写)和Base16(十六进制数字)描述为可能更安全的替代方案。

使用Unicode不会更好。添加许多字符会引入更多可能的失败点。根据您的要求的严格程度,您可能会有 N 的不同值。我将介绍从大型 N 到小型 N 的一些可能性,每次都添加一个要求。

  • 1,114,112:代码点。这是Unicode标准定义的可能代码点数。
  • 1,112,064:有效UTF 。这排除了不能独立的代理人。
  • 1,111,998:适用于流程之间的交换。 Unicode将66个代码点保留为永久non-characters,仅供内部使用。从理论上讲,这是您可以合理地期望复制粘贴方案的最大 N ,但正如您所指出的,在实践中,许多其他Unicode字符串将无法通过该练习。
  • 120,503:仅限可打印字符,具体取决于您的定义。我已将其定义为其他分隔符 general categories之外的所有字符。此外,从此项目符号开始, N 在将来的Unicode版本中可能会发生变化。
  • 103,595: NFKD规范化Unicode 。不幸的是,许多流程自动normalize Unicode输入标准化表格。如果该过程使用NFKC或NFKD,则某些信息可能已丢失。为了提高可靠性,编码应该定义一个规范化形式,其中NFKD更适合增加字符数
  • 101,684:combining characters 。这些是不应该独立存在的“角色”,例如重音,并且意味着与另一个基本角色组合。如果单独使用某些进程,或者如果单个基本字符上的组合字符太多,则某些进程可能会发生混乱。我现在已经排除了 Mark 类别。
  • 85: ASCII85 ,又名。我想要我的ASCII回来。好的,这不再是Unicode,但我觉得提到它是因为它是一种鲜为人知的纯ASCII编码。它主要用于Adobe的PostScript和PDF格式,并且以5:4的编码数据大小增加,而不是Base64的4:3比率。