【问题标题】:Base64 Encoded String for Filename文件名的 Base64 编码字符串
【发布时间】:2021-01-23 20:22:45
【问题描述】:

我想不出这会导致问题的操作系统(Linux、Windows、Unix),但也许这里有人可以告诉我这种方法是否不可取。

我想使用 base64 编码的字符串作为文件名。类似于gH9JZDP3+UEXeZz3+ng7Lw==。这可能会导致任何地方出现问题吗?

编辑:我可能会将其保留为最多 24 个字符

编辑:看起来我有一个会引起问题的角色。生成我的字符串的函数提供如下内容:J2db3/pULejEdNiB+wZRow== 您会注意到这有一个/,这会导致问题。

根据this site/ 是一个有效的 base64 字符,所以我不能使用 base64 编码的字符串作为文件名。

【问题讨论】:

    标签: filenames


    【解决方案1】:

    没有。您不能使用base64 编码字符串作为文件名。这是因为/ 字符对base64 字符串有效,这将导致文件系统出现问题。

    https://base64.guru/learn/base64-characters

    替代方案:

    您可以使用base64,然后替换不需要的字符,但更好的选择是使用bin2hex() 之类的函数对原始字符串进行十六进制编码。

    【讨论】:

      【解决方案2】:

      官方RFC 4648表示:

      已建议使用“~”作为第 63 个字符的替代字母表。由于“~”字符在某些文件系统环境中具有特殊含义,因此推荐使用本节介绍的编码。剩余的未保留 URI 字符是“.”,但某些文件系统环境不允许多个“.”。在文件名中,从而使“。”性格也没有吸引力。

      我还在serverfault stackexchange上找到了this

      没有像“Unix”文件系统这样的东西。也不是“Windows”文件系统。您是指 NTFS、FAT16、FAT32、ext2、ext3、ext4 等吗?每个对名称中的有效字符都有自己的限制。

      另外,你的问题标题和问题是指两个完全不同的概念?您想知道合法字符的子集,还是想知道两个系统中可以使用哪些通配符?

      http://en.wikipedia.org/wiki/Ext3 声明“文件名中允许使用除 NULL 和 '/' 之外的所有字节”。

      http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx 描述了“不管文件系统”有效文件名的一般情况。特别是,以下字符是保留的:" / \ | ?*

      Windows 还限制不使用文件的设备名称:CON、PRN、AUX、NUL、COM1、COM2、COM3 等。

      基于 Windows 和 Unix 的操作系统中的大多数命令都接受 * 作为通配符。 Windows 接受 % 作为单个字符通配符,而 Unix 系统的 shell 使用 ?作为单字符通配符。

      还有this other one:

      Base64 仅包含 A–Z、a–z、0–9、+、/ 和 =。所以不使用的字符列表是:所有可能的字符减去上面提到的字符。

      用于特殊用途。和 _ 也是可能的。

      这意味着您应该使用_. 而不是标准的/ base64 字符;在 UNIX 和 Windows 上都可以。

      许多编程语言允许您将所有/ 替换为_.,因为它只有一个字符,可以通过一个简单的循环来完成。

      【讨论】:

        【解决方案3】:

        在 Windows 中,只要符合 Windows 的命名约定就可以了: https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions.

        据我所知,任何 base64 编码的字符串都不包含任何保留字符。

        可能会成为问题的是文件名的长度。

        【讨论】:

        • 这是错误的,因为 Base64 字符串可能包含正斜杠,这在 Windows 和其他操作系统中都是保留字符。要使用 Base64 作为文件名,您必须使用 Base64URL 标准。
        猜你喜欢
        • 1970-01-01
        • 2019-02-26
        • 1970-01-01
        • 2011-09-10
        • 1970-01-01
        • 2018-12-28
        • 1970-01-01
        • 2018-07-10
        • 1970-01-01
        相关资源
        最近更新 更多