与 base = 64 的 base64 相比,Unicode 字符串对编码 base 的限制是什么?
What is the limit to encoding base in case of Unicode strings as opposed to base64 having base = 64?
这实际上与一般的代码高尔夫有关,但也适用于其他地方。 人们通常使用base64编码来存储源代码中的大量二进制数据。
假设所有编程语言都乐于阅读 Unicode 源代码,我们可以可靠地设计 baseN 编码的最大 N 是多少?
此处的可靠性意味着能够 encode/decode 任何数据,因此可以对输入字节的每个组合进行编码,然后进行解码。编码形式不受此规则约束。
主要目标是尽量减少字符数,而不考虑字节数。
会不会是base2147483647(32位)?
此外,因为我知道它可能因浏览器而异,而且我们已经遇到从 codegolf 答案复制粘贴代码给我们的编辑的问题,复制粘贴能力也是一个因素。我知道有一个 Unicode 字符范围没有显示。
注意:
我知道对于二进制数据,base64通常会扩展数据,但这里字符数是主要因素。
这实际上取决于您希望编码可靠的程度。字符编码是用trade-offs设计的,一般来说,允许的字符越多,被普遍接受的可能性就越小,即越不可靠。 Base64 不能幸免于此。 RFC 3548,2003 年发布,提到区分大小写可能是一个问题,字符 +
和 /
在某些情况下可能会出现问题。它将 Base32(无小写字母)和 Base16(十六进制数字)描述为可能更安全的替代方案。
使用 Unicode 并没有变得更好。添加那么多字符会引入更多可能的故障点。根据您的要求有多严格,N 可能有不同的值。我将涵盖从大 N 到小 N 的几种可能性,每次都添加一个要求。
- 1,114,112:代码点。这是 Unicode 标准定义的可能代码点数。
- 1,112,064:有效 UTF。不包括不能自立的代母。
- 1,111,998:进程间交换有效。 Unicode 保留 66 个代码点作为永久 non-characters 仅供内部使用。从理论上讲,这是 N 您对 copy-paste 场景合理预期的最大值,但正如您所指出的,实际上许多其他 Unicode 字符串将无法通过该练习。
- 120,503:仅限可打印字符,具体取决于您的定义。我将其定义为 Other 和 Separator general categories 之外的所有字符。此外,从这个要点开始,N 在未来的 Unicode 版本中可能会发生变化。
- 103,595:NFKD 规范化 Unicode。不幸的是,许多过程会自动 normalize Unicode 输入标准化表格。如果进程使用了 NFKC 或 NFKD,一些信息可能已经丢失。为了提高可靠性,编码应因此定义规范化形式,NFKD 更适合增加字符数
- 101,684:否combining characters。这些是不应该单独存在的“字符”,例如重音符号,应该与另一个基本字符组合使用。如果单独留下一些进程,或者如果单个基本字符上有太多组合字符,则某些进程可能会崩溃。我现在已经排除了 Mark 类别。
- 85:ASCII85,又名。我想要我的 ASCII 码。好的,这不再是 Unicode,但我想提一下它,因为它是一种鲜为人知的 ASCII-only 编码。它主要用于 Adobe 的 PostScript 和 PDF 格式,并且有 5:4 编码数据大小增加,而不是 Base64 的 4:3 比率。
这实际上与一般的代码高尔夫有关,但也适用于其他地方。 人们通常使用base64编码来存储源代码中的大量二进制数据。
假设所有编程语言都乐于阅读 Unicode 源代码,我们可以可靠地设计 baseN 编码的最大 N 是多少?
此处的可靠性意味着能够 encode/decode 任何数据,因此可以对输入字节的每个组合进行编码,然后进行解码。编码形式不受此规则约束。
主要目标是尽量减少字符数,而不考虑字节数。
会不会是base2147483647(32位)?
此外,因为我知道它可能因浏览器而异,而且我们已经遇到从 codegolf 答案复制粘贴代码给我们的编辑的问题,复制粘贴能力也是一个因素。我知道有一个 Unicode 字符范围没有显示。
注意: 我知道对于二进制数据,base64通常会扩展数据,但这里字符数是主要因素。
这实际上取决于您希望编码可靠的程度。字符编码是用trade-offs设计的,一般来说,允许的字符越多,被普遍接受的可能性就越小,即越不可靠。 Base64 不能幸免于此。 RFC 3548,2003 年发布,提到区分大小写可能是一个问题,字符 +
和 /
在某些情况下可能会出现问题。它将 Base32(无小写字母)和 Base16(十六进制数字)描述为可能更安全的替代方案。
使用 Unicode 并没有变得更好。添加那么多字符会引入更多可能的故障点。根据您的要求有多严格,N 可能有不同的值。我将涵盖从大 N 到小 N 的几种可能性,每次都添加一个要求。
- 1,114,112:代码点。这是 Unicode 标准定义的可能代码点数。
- 1,112,064:有效 UTF。不包括不能自立的代母。
- 1,111,998:进程间交换有效。 Unicode 保留 66 个代码点作为永久 non-characters 仅供内部使用。从理论上讲,这是 N 您对 copy-paste 场景合理预期的最大值,但正如您所指出的,实际上许多其他 Unicode 字符串将无法通过该练习。
- 120,503:仅限可打印字符,具体取决于您的定义。我将其定义为 Other 和 Separator general categories 之外的所有字符。此外,从这个要点开始,N 在未来的 Unicode 版本中可能会发生变化。
- 103,595:NFKD 规范化 Unicode。不幸的是,许多过程会自动 normalize Unicode 输入标准化表格。如果进程使用了 NFKC 或 NFKD,一些信息可能已经丢失。为了提高可靠性,编码应因此定义规范化形式,NFKD 更适合增加字符数
- 101,684:否combining characters。这些是不应该单独存在的“字符”,例如重音符号,应该与另一个基本字符组合使用。如果单独留下一些进程,或者如果单个基本字符上有太多组合字符,则某些进程可能会崩溃。我现在已经排除了 Mark 类别。
- 85:ASCII85,又名。我想要我的 ASCII 码。好的,这不再是 Unicode,但我想提一下它,因为它是一种鲜为人知的 ASCII-only 编码。它主要用于 Adobe 的 PostScript 和 PDF 格式,并且有 5:4 编码数据大小增加,而不是 Base64 的 4:3 比率。