文件名的Base64编码字符串

时间:2020-10-08 18:15:01

标签: filenames

我想不出一个操作系统(Linux,Windows,Unix)会引起问题,但是也许有人可以告诉我这种方法是否不受欢迎。

我想使用base64编码的字符串作为文件名。类似于class MainApplication(tk.Tk): def __init__(self, master, *args, **kwargs): tk.Frame.__init__(self, master) self.master = master self.shared_data = {"listbox1": []} self.container = tk.Frame(self) self.container.pack(side="top", fill="both", expand=True) self.container.grid_rowconfigure(0, weight=1) self.container.grid_columnconfigure(0, weight=1) self.frames = {} self.frames["A"] = A(master=self.container, controller=self) self.frames["B"] = B(master=self.container, controller=self) self.top_frame = Frame(master) self.top_frame.pack(side=TOP, expand=True) self.bottom_frame = Frame(master) self.bottom_frame.pack(side=BOTTOM, expand=True) self.left_frame = Frame(self.bottom_frame) self.left_frame.pack(side=LEFT, expand=True) self.right_frame = Frame(self.bottom_frame) self.right_frame.pack(side=RIGHT, expand=True) self.A = A(self.top_frame, controller=self) self.B = B(self.left_frame, controller=self) def get_page(self, c): return self.frames[c] class A(tk.Frame): def __init__(self, master, controller): tk.Frame.__init__(self, master) self.master = master self.controller = controller self.Buttonfont = tkFont.Font(family="arial", size=15, weight=tkFont.BOLD) self.frame = Frame(self.master) self.frame.pack() self.master.openfile = Button(self.frame, text="Open File", font=self.Buttonfont, command=lambda:[self.import_dataframe(), self.refresh_B()]) self.master.openfile.pack(side=TOP) def import_dataframe(self): #with pandas: #self.filename = filedialog.askopenfilename(initialdir="/", title="Select File", filetypes=(("Comma Separated Values", "*.csv"), ("Excelsheet","*.xlsx"))) #df = pd.read_csv(self.filename, index_col = 0) #self.controller.shared_data["listbox1"] = df.columns.to_list() #without pandas: self.controller.shared_data["listbox1"] = ["item1", "item2"] def refresh_B(self): self.controller.B.listbox.destroy() self.controller.B.listbox = Listbox(self.controller.B.listframe, height=30, width=50) self.controller.B.listbox.pack() for i in self.controller.shared_data["listbox1"]: self.controller.B.listbox.insert(END, i) class B(tk.Frame): def __init__(self, master, controller): tk.Frame.__init__(self, master) self.master = master self.controller = controller self.listframe = Frame(self.master) self.listframe.pack(side=TOP, fill="both") self.listbox = Listbox(self.listframe, height=30, width=50) self.listbox.pack(side=TOP) 。这有可能在任何地方引起问题吗?

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

编辑:看来我的角色会引起问题。生成字符串的函数正在提供类似以下的字符串:gH9JZDP3+UEXeZz3+ng7Lw== 您会注意到它有一个J2db3/pULejEdNiB+wZRow==,它将引起问题。

根据this site/是有效的base64字符,因此我将无法使用base64编码的字符串作为文件名。

3 个答案:

答案 0 :(得分:1)

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

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

替代项:

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

答案 1 :(得分:0)

官方RFC 4648声明:

已建议使用替代字母,该字母将“〜”用作第63个字符。由于“〜”字符在某些文件系统环境中具有特殊含义,因此建议改用本节中描述的编码。剩余的未保留URI字符为“。”,但是某些文件系统环境不允许使用多个“。”。在文件名中,因此为“。”角色也没有吸引力。

我还在this发现的serverfault stackexchange上找到了

没有“ Unix”文件系统之类的东西。也没有“ Windows”文件系统。您是指NTFS,FAT16,FAT32,ext2,ext3,ext4等。名称中的每个有效字符都有各自的限制。

此外,您的问题标题和问题涉及两个完全不同的概念?您是否想知道合法字符的子集,还是想在两种系统中都可以使用哪些通配符?

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

http://msdn.microsoft.com/zh-cn/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上都可以。

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

答案 2 :(得分:-1)

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

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

可能会出现问题的是文件名过长。