我很难理解文件名编码的工作方式。在unix.SE上,我发现矛盾的解释。
文件名存储为字符
引用另一个答案: 关于Linux上文件系统字符编码的几个问题
正如您在问题中提到的[…],UNIX文件名只是一个字符序列;内核对编码一无所知,而编码完全是用户空间(即应用程序级)的概念。
如果文件名存储为字符,则必须进行某种编码,因为最后文件名必须以磁盘上的位或字节序列结尾。如果用户可以选择任何编码来将字符映射到馈送给内核的字节序列,则可以为有效文件名创建任何字节序列。
假设以下内容:用户使用随机编码X,它将文件foo
转换为字节序列α并将其保存到磁盘。另一个用户使用编码ÿ。在这种编码中,α转换为/
,不允许作为文件名。但是,对于第一个用户,该文件有效。
我认为这种情况不会发生。
文件名存储为二进制Blob
引用另一个答案: 在Linux上,文件名和路径使用哪种字符集编码?
正如其他人所指出的那样,这确实没有答案:文件名和路径没有编码。OS仅处理字节序列。各个应用程序可能选择将它们解释为以某种方式进行编码,但这有所不同。
如果系统不处理字符,如何在文件名中禁止使用特定字符(例如/
或NULL
)?没有/
编码就没有a的概念。
一种解释是,文件系统可以存储包含任何
字符的文件名,只有考虑到编码的用户程序才会阻止包含无效字符的文件名。反过来,这意味着文件系统和内核可以毫无困难地处理包含/
。的文件名。
我也认为这是错误的。
编码在哪里进行,不允许使用特定字符的限制在哪里?