与base=64的base64不同,在Unicode字符串中编码base的限制是什么?

与base=64的base64不同,在Unicode字符串中编码base的限制是什么?,unicode,encoding,language-agnostic,Unicode,Encoding,Language Agnostic,这实际上与代码高尔夫有关,但也适用于其他地方人们通常使用base64编码在源代码中存储大量二进制数据 假设所有编程语言都乐于阅读Unicode源代码,我们可以可靠地设计baseN编码的max N是多少 这里的可靠性意味着能够对任何数据进行编码/解码,因此可以对输入字节的每个组合进行编码,然后进行解码。编码表单不受此规则约束 主要目标是最小化字符计数,而不考虑字节计数 是否为base2147483647(32位)? 另外,因为我知道它可能因浏览器而异,而且我们已经有了从codegolf答案复制粘贴

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

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

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

主要目标是最小化字符计数,而不考虑字节计数

是否为base2147483647(32位)?

另外,因为我知道它可能因浏览器而异,而且我们已经有了从codegolf答案复制粘贴代码到我们的编辑器的问题,所以复制粘贴能力也是一个因素。我知道有一个Unicode范围的字符不显示

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

这实际上取决于您希望编码的可靠性。字符编码是在权衡的基础上设计的,一般来说,允许的字符越多,其被普遍接受的可能性就越小,即可靠性就越低。Base64也不能幸免于此,2003年出版的该书提到区分大小写可能是一个问题,字符
+
/
在某些情况下可能有问题。它将Base32(无小写)和Base16(十六进制数字)描述为可能更安全的替代方案

使用Unicode并不能让它变得更好。添加这么多字符会导致更多可能的故障点。根据您的要求有多严格,N可能有不同的值。我将介绍从大N到小N的几种可能性,每次添加一个要求

  • 1114112:代码点。这是Unicode标准定义的可能代码点的数量
  • 1112064:有效。这就排除了不能独立站立的代理
  • 1111998:对进程之间的交换有效。Unicode保留66个代码点作为永久性代码点,仅供内部使用。从理论上讲,这是复制粘贴场景中可以合理预期的最大N,但正如您所指出的,在实践中,许多其他Unicode字符串都会失败
  • 120503:仅可打印字符,具体取决于您的定义。我将它定义为除其他字符和分隔符之外的所有字符。此外,从这一点开始,N可能会在未来的Unicode版本中发生变化
  • 103595:NFKD标准化Unicode。不幸的是,许多流程会自动输入到标准化表单中。如果流程使用NFKC或NFKD,则某些信息可能已丢失。为了提高可靠性,编码应该定义一个规范化形式,NFKD更适合增加字符数
  • 101684:。这些是不应该独立存在的“字符”,例如重音,并且意味着要与另一个基本字符组合。如果某些进程处于独立状态,或者如果单个基字符上的组合字符太多,则可能会出现死机。我现在已经排除了标记类别
  • 85:,又名。我想要回我的ASCII码。好的,这不再是Unicode,但我想提及它,因为它是一种鲜为人知的ASCII编码。它主要用于Adobe的PostScript和PDF格式,编码数据大小增加了5:4,而不是Base64的4:3

我知道,对于二进制数据,base64通常会扩展数据,但这里的字符数是主要因素。“人们通常使用base64编码以紧凑的形式存储大量数据”-不,他们不会。Base64将编码数据的大小增加4/3。Base64通常用于不允许使用二进制数据但允许使用可打印ASCII字符的情况。抱歉,时间太晚了。编辑。还要注意这个注释和我的评论。用Unicode编码您的有效负载比简单地将其存储为二进制文件有什么改进?无论如何,每个字节都不能超过一个字节。无论哪种方式,主要问题都是如何防止有效负载与程序数据混合,这或多或少是效率较低的编码优雅地解决的唯一问题。如果你想允许使用自由格式的Unicode,那么如何对包含任何序列的有效负载进行编码,否则这些序列将被视为有效负载终止符?@tripleee我当然没有看到终止符问题的出现。我会等到发帖一周后才接受你的答案,但到目前为止,你的答案是一个不错的选择。此外,最欢迎参考。谢谢你的意见!:)