在Windows和Linux目录名称中,哪些字符是禁止使用的?

651

我知道在Linux中“/”是非法的,而在Windows中,"*" "\" "<" ">" ":" "|" "?" 是非法的。

还有其他什么我需要注意的吗?我需要一份全面的指南,也要考虑双字节字符。


31
您提到的一些字符实际上是在Windows系统中被允许使用的。请参考以下命令:echo abc > "ab.;,=[1]" - dolmen
11
请注意,<和>在Windows系统中是非法字符。 - AnotherParker
7
在Linux中,/并不是非法字符。当您输入它时,只需要用\进行转义即可。 - David C. Bishop
7
@DavidC.Bishop:这篇 Stack Overflow 帖子声称 Linux 内核会阻止你使用包含斜杠的文件名。你有成功使用过吗? - Soren Bjornstad
54
“/在Linux中不是非法的。只需在输入时使用\进行转义即可。”--这个说法完全是错误的。文件名组件不能包含 /,并且转义它没有任何效果。 - Jim Balter
显示剩余10条评论
21个回答

1030
  1. 被禁止的可打印ASCII字符包括:

    • Linux/Unix:

        / (forward slash)
      
    • Windows:

        < (less than)
        > (greater than)
        : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
        " (double quote)
        / (forward slash)
        \ (backslash)
        | (vertical bar or pipe)
        ? (question mark)
        * (asterisk)
      
  2. 不可打印字符

    如果你的数据来自允许使用不可打印字符的数据源,则需要进行更多的检查。

    • Linux/Unix:

  3.   0 (NULL byte)
    
  4. Windows:

      0-31 (ASCII control characters)
    
  5. 注意:虽然在Linux/Unix文件系统下创建包含控制字符的文件名是合法的,但对于用户来说,处理这些文件可能会成为噩梦

  6. 保留文件名

    以下文件名是保留的:

    • Windows:

        CON, PRN, AUX, NUL 
        COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
        LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
      

      (无论是单独使用还是带有任意文件扩展名,例如LPT1.txt)。

  7. 其他规则

    • Windows:

      文件名不能以空格或点结束。

    • macOS:

      您没有要求,但以防万一:冒号:和正斜杠/根据上下文不允许使用(例如Finder支持斜杠,终端支持冒号)。 (更多详情)


6
请注意,在将DOS路径转换为本地NT路径时,保留的DOS设备名称和文件名以点或空格结尾的规则是由运行时库应用的。如果路径以“\?\”本地设备前缀开头,则跳过此规范化步骤,只替换“\?\”为NT的“??\”设备前缀。此前缀指示对象管理器在登录会话和全局DOS设备目录中搜索符号链接以连接到本地NT设备,通常是位于“\Device”目录中的设备对象。 - Eryk Sun
4
另一方面,保留字符不仅仅是DOS命名空间的函数。它们在内核和文件系统中的低级别被保留。 "" 字符是NT的路径分隔符,并由对象管理器保留。其他所有内容均允许用于对象名称,其中包括DOS设备名称,例如 "C:"。其他保留字符(包括ASCII控制字符)是由内核的文件系统运行库保留的,这些库被Microsoft的文件系统使用。这些字符在主文件名中被保留,而不是在流名中。 - Eryk Sun
7
*?<>"这些字符被保留为“通配符字符”(wildcard characters),这是由于特殊的设计决策,要求文件系统在实现NtQueryDirectoryFile系统调用时,在其低层级上过滤目录列表。在POSIX系统中,这是在应用程序级别上实现的。 - Eryk Sun
9
在大多数Linux发行版中,你可以用正斜杠来为文件命名,但实际上不可以。内核会始终将正斜杠视为目录分隔符,而不仅仅是shell。无论是用C程序、Python脚本还是其他任何方式,都无法避免这种情况。 - Jim Balter
4
有趣的事实:使用Cygwin,您可以轻松创建lpt1lpt1.txt然后尝试在Windows资源管理器中删除它们:您无法删除。或者在cmd.exe中:也无法删除。但是Cygwin可以删除。这似乎是一个被人工维护的20世纪80年代限制。 - Lutz Prechelt
显示剩余10条评论

269
在Windows中,“全面指南”禁止的文件名字符不起作用,因为它保留了文件名和字符。是的,诸如*"?等字符是被禁止的,但只由有效字符组成的名称却有无限个被禁止。例如,空格和点是有效的文件名字符,但是只由这些字符组成的名称是被禁止的。
Windows不区分大小写,因此如果已经存在一个名为a的文件夹,您就无法创建名为A的文件夹。更糟糕的是,看似允许的名称如PRNCON以及许多其他名称都是保留的并且不允许使用。Windows还有几个长度限制;在一个文件夹中有效的文件名,如果移到另一个文件夹中可能会变得无效。命名文件和文件夹的规则在Microsoft文档中。
通常情况下,您不能使用用户生成的文本来创建Windows目录名称。如果您想允许用户命名任何他们想要的东西,那么您必须创建像AABA2等安全名称,将用户生成的名称及其路径等效存储在应用程序数据文件中,并在应用程序中执行路径映射。
如果您绝对必须允许用户生成的文件夹名称,则唯一的方法是捕获异常并假定该名称无效。即使如此,因为拒绝访问、离线驱动器和驱动器空间不足引发的异常与可以为无效名称引发的异常重叠,所以这仍然存在风险。您正在打开一个巨大的伤痛罐头。

12
MSDN链接中的关键短语是“[和目标文件系统不允许的]任何其他字符”。Windows上可能有不同的文件系统。有些可能允许Unicode,而其他一些可能不允许。一般来说,验证名称的唯一安全方式是在目标设备上尝试它。 - Adrian McCarthy
130
有一些准则,而“有无限数量的仅由有效字符组成但被禁止使用的名称”并不是建设性的。同样,“Windows 不区分大小写字符”是一个愚蠢的例外——提问者询问的是语法而非语义,没有理智的人会说像 A.txt 这样的文件名是“无效的”,因为可能存在 a.TXT - Borodin
12
COPY CON PRN 的意思是从键盘输入(或者可能是标准输入)读取内容,并将其复制到打印机设备上。不确定在现代的Windows系统中是否仍然有效,但长期以来肯定可以使用。在早期,你可以使用它来输入文本并使点阵式打印机简单地输出它。 - AntonPiatek
8
通常情况下,你不能使用用户生成的文本来创建Windows目录名称。如果你想这样做,你可以创建一个字符白名单,但是如果忽略已存在的问题,它可能基本起作用。 - Casey
17
除非我误解了,否则这并不是一个建设性的回答,因为如果文件名的规则已经被定义得很明确且本身不是无限的话,“由有效字符组成但又被禁止的无限数量的名称”就变得相当无意义。这个回答中没有任何东西能够证明将可能性描绘成无限的方式对读者有帮助或有用。例如,对比以下两种说法:(1)在Linux中,“/”是不允许的。(2)对于Linux来说,没有全面的指南是可能的,因为存在着无限数量的不允许使用的名称,例如“/”,“//”,“///”,“a/a”,“b/b”等。 - JBentley
显示剩余4条评论

91

在Linux和其他Unix相关系统中,文件或目录名称中传统上只有两个字符是不允许出现的,它们分别是NUL '\0'和斜杠'/'。当然,斜杠可以出现在路径名中,用于分隔目录组件。

传闻1称,史蒂文·伯恩(“shell”的创始人)曾经拥有一个包含254个文件的目录,每个文件名都包含可以出现在文件名中的每个字母(字符代码),但不包括/'\0';而名称.代表当前目录。这个目录被用来测试Bourne shell,并经常对备份程序等不谨慎的程序造成破坏。

其他 人员已经介绍了Windows文件名的规则,并提供了有关该主题的MicrosoftWikipedia链接。

请注意,MacOS X 具有不区分大小写的文件系统。当前版本似乎允许在文件名中使用冒号 “:”,但历史上并非总是这样。
$ echo a:b > a:b
$ ls -l a:b
-rw-r--r--  1 jonathanleffler  staff  4 Nov 12 07:38 a:b
$

然而,至少在macOS Big Sur 11.7中,文件系统不允许使用无效的UTF-8字符串作为文件名。这意味着文件名不能由UTF-8中始终无效的字节(0xC0、0xC1、0xF5-0xFF)组成,并且您不能将连续字节0x80..0xBF作为文件名中唯一的字节。错误代码为92,非法字节序列。

POSIX定义了一个可移植文件名字符集,包括:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 . _ -

如果坚持使用仅由这些字符组成的名称,就可以避免大多数问题,尽管Windows仍会添加一些复杂性。


1 在《编程实践》的第6章“测试”中,Kernighan和Pike曾说过:

当Steve Bourne编写他的Unix shell(后来被称为Bourne shell)时,他创建了一个包含254个文件的目录,每个文件名只有一个字符,分别代表除了'\0'和斜杠之外的每个字节值。他使用该目录进行各种模式匹配和标记化测试。(当然,测试目录是由程序创建的。)多年以后,那个目录成为了遍历文件树程序的噩梦;它将它们测试到了崩溃。

请注意,该目录必须包含条目 . .. ,因此它可能是253个文件(和2个目录),或255个名称条目,而不是254个文件。这并不影响这个轶事的有效性,也不影响它所描述的仔细测试。

TPOP先前在http://plan9.bell-labs.com/cm/cs/tpophttp://cm.bell-labs.com/cm/cs/tpop,但两者现在(2021-11-12)均无法使用。 此外,请参考维基百科关于TPOP的内容。


1
254个文件?那UTF8呢? - j_kubik
29
这 254 个文件都是单个字符的文件名,每个文件名都只包含允许在文件名中使用的一个字符。当 Steve Bourne 创造 Bourne shell 时,UTF-8 还没有出现。UTF-8 强制规定了字节序列的有效组合方式(不允许使用字节 0xC0、0xC1、0xF5-0xFF)。除此之外,在我所讨论的细节层面上,它并没有太大的区别。 - Jonathan Leffler
2
MacOS HFS+文件系统的磁盘目录分隔符实际上是“:”,而不是“/”。当您使用*nix API时,操作系统通常(可能总是)会做正确的事情。但是,如果您要转移到OSX世界,例如使用applescript,则不要指望这种可靠性。看起来Cocoa API可能使用/并将:隐藏在您身后,但我非常确定旧的Carbon API不会这样做。 - Dan Pritts
1
请注意,如果目录名称中包含冒号,则无法将该目录添加到Unix的“PATH”变量中,因为冒号用作分隔符(在Windows上为分号)。因此,在这样的目录中运行程序必须使用指定其位置的路径名(可以是相对或绝对路径),或者您必须在目录中并且在“PATH”中有点(“。”,当前目录),但这被广泛认为是不安全的。 - Jonathan Leffler
2
就我个人而言:在运行macOS Big Sur 11.7的MacBook Pro上,我可以创建一个名为“:”的文件,但我无法创建完整名称为单个字节0xC0、0xC1、0xF5..0xFF或任何UTF-8连续字节0x80..0xBF的文件。错误编号为92,“非法字节序列”。由此推断,macOS坚持要求文件名是有效的UTF-8字符串,不包含“/”或空字节。我还没有检查像U+FFFF这样的非字符、代理范围、PUA(专用区域)范围和未分配代码块中的字符,例如U+80000..U+8FFFF。 - Jonathan Leffler
显示剩余3条评论

48

不必创建一个字符黑名单,可以使用白名单。总体来说,在文件或目录名称上下文中具有意义的字符范围相当短,除非您有一些非常特定的命名要求,否则如果用户不能使用整个 ASCII 表,他们不会反感您的应用程序。

这并不能解决目标文件系统中保留名称的问题,但是通过白名单可以更容易地在源头上减轻风险。

基于此,以下是可以考虑为安全的字符范围:

  • 字母 (a-z A-Z) - Unicode 字符也可以使用,如果需要
  • 数字 (0-9)
  • 下划线 (_)
  • 连字符 (-)
  • 空格
  • 点 (.)

以及您希望允许的任何其他安全字符。除此之外,您只需强制执行一些关于空格和点的附加规则。这通常足够了:

  • 名称必须包含至少一个字母或数字(避免仅包含点/空格)
  • 名称必须以字母或数字开头(避免前导点/空格)
  • 名称不得以点或空格结尾(如果存在,请简单地修剪这些字符,就像资源管理器一样)

这已经允许相当复杂和荒谬的名称。例如,使用这些规则,以下名称将在 Windows/Linux 中成为有效文件名:

  • A...........ext
  • B -.- .ext

实际上,即使只有如此少量的白名单字符,您仍然应该决定什么实际上是有意义的,并相应地验证/调整名称。在我的一个应用程序中,我使用了与上述相同的规则,但剥离了任何重复的点和空格。


42
我的非英语使用者怎么办?他们会因此而受影响吗? - pkh
5
我们采用白名单机制,但不要忘记在Windows上你需要管理保留、大小写无关的字符串,例如设备名称(prn、lpt1、con)以及“.”和“..”。 - tahoar
6
总的来说,在文件名或目录名上下文中有意义的字符范围相当短,但对于某些用例可能并非如此。我现在正在处理涉及20种语言的媒体文件的项目,文件名需要反映媒体项的标题,因为最终用户将通过这种方式找到内容。其中许多名称使用标点符号。文件名字符的任何限制都会带来代价,因此在这种情况下,我们必须尽量减少限制。在这种用例中,与有意义的字符相比,不具有意义的字符的范围要简单得多且更短。 - LarsH
7
现今很多软件都面临一个现实,就是你不知道客户会是谁,也不知道他们使用的语言。例如,如果你在应用商店或Windows/Apple商店发布产品给普通大众使用,你可以默认将软件设置为只支持英语(或欧洲语言)这种常见做法。但对于其他语言的用户来说,这样做非常令人沮丧,因为他们需要寻找满足自己需求的软件。同时,这也可能导致开发者失去可避免的收入。而设计程序使其几乎无需脚本化的工作量并不算太大。 - LarsH
6
我会说,任何好的代码都会说出它的意思。在这种情况下,白名单感觉很像一种“货物崇拜”式的解决方案,在面对数百万个“未知未知”的情况下将会崩溃。你所做的不是禁止不可能的值,而是禁止你害怕测试的值。 - atimholt
显示剩余11条评论

42
获取Windows告诉你答案的简单方法是通过资源管理器尝试重命名文件,并在新名称中输入任何非法字符,例如反斜杠\。Windows将弹出一个消息框告诉您非法字符的列表:
引用: 文件名不能包含以下任何字符: \ / : * ? " < > |
这是来自Windows 10专业版的弹出窗口的屏幕截图:

enter image description here

请参阅:Microsoft Docs - 命名文件、路径和命名空间 - 命名约定

3
我记得以前是这样的。我刚在Windows 10上尝试了一下,那个消息框不再弹出了,取而代之的是播放了一个声音。 - Zsolti
我冒昧添加了一张截图。不幸的是,您提供的链接已经失效。我将其更新为存档链接,但它只能勉强使用。 - Cadoiz
1
这是错误消息的样子 - 添加它的编辑被拒绝了。存档链接不再需要,感谢最后的编辑者。在Win11中是什么样子?消息/声音/??? - Cadoiz
1
这是错误消息的样子 - 添加它的编辑被拒绝了。存档链接不再需要,感谢最后的编辑者。在Win11中是什么样子?消息/声音/??? - undefined

29

如果仅出于研究目的,那么您最好查看文件名的保留字符和词语的维基百科条目。

如果您想编写一个可移植的函数来验证用户输入并基于此创建文件名,简短的答案是不要这样做。查看类似Perl的File::Spec这样的可移植模块可以了解完成这样一个“简单”任务所需的所有步骤。


26
讨论不同的可能方法

对于定义“什么是合法和非法”的困难已经得到解决,并且已经提出了白名单建议。但不仅仅是Windows,许多类Unix操作系统也支持Unicode等多于8位的字符。在这里,你还可以谈论诸如UTF-8的编码。你可以考虑Jonathan Leffler的评论,他提供了关于现代Linux和描述MacOS细节的信息。维基百科指出,(例如)

修改字母冒号(见下文第7点)有时会在Windows文件名中使用,因为它与用于文件名的Segoe UI字体中的冒号完全相同。而继承自ASCII的冒号本身是不允许的。
因此,我想提出一种更加自由的方法,使用Unicode同形异义字符来替换“非法”的字符。在我的可比较使用案例中,我发现结果更易读,并且仅受所使用的字体限制,而这个字体非常广泛,Windows默认情况下有3903个字符。此外,您甚至可以从替换中恢复原始内容。

使用整个Unicode块(例如“全角字符”)作为替换

为了保持事物有条理,我将始终给出字符、名称和十六进制表示的编号。在评论中,i30817 谈到了一个专门为“滥用非法字符的愚蠢操作系统”保留的范围,这基本上就是比尔·塞勒斯 显然在做的事情:“它可能不够漂亮,但它总是有效并且更容易记住。”在候选区块中,有全角字符小写形式变体、组合/修饰/覆盖(见下面的第4点)或半角字符。请参考下表以获得概览:
角色名称 原始代码 原始字符 全角代码 全角字符 小写形式变体 小写形式变体代码
1. 星号 U+2A * U+FF0A U+FE61
2. 句号 U+2E . U+FF0E U+FE52
3. 引号 U+22 " U+FF02
4. 反斜杠 U+5C \ U+FF3C U+FE68
5. 斜杠 U+2F / U+FF0F
6.1. 左方括号 U+5B [ U+FF3B (仅乌龟) U+FE5D
6.2. 右方括号 U+5D ] U+FF3D (仅乌龟) U+FE5E
7. 冒号 U+3A : U+FF3A U+FE55
8. 分号 U+3B ; U+FF1B U+FE54
9. 竖线 U+7C | U+FF5C
10. 逗号 U+2C , U+FF0C U+FE50
11. 问号 U+3F ? U+FF1F U+FE56
12.1. 大于号 U+3E > U+FF1E U+FE65
12.2. 小于号 U+3C < U+FF1C U+FE64
13. 抑扬符号 U+5E ^ U+FF3E
一些全角字符(1、6.1、6.2和11)也包括在下面的“更多可能的选择和研究笔记”中。
如何输入非标准字符
假设你想输入ⵏ(提非纳字母扬)。要获取它的所有信息,你可以在适合的平台上搜索这个字符(ⵏ),比如这个Unicode查找工具那个Unicode表格(只允许搜索名称,比如“提非纳字母扬”)。你应该得到它的Unicode编号U+2D4F和HTML代码&#11599;(注意,2D4F是十六进制表示的11599)。有了这些知识,你有几种选择来生成这些特殊字符,包括使用以下方法:
  • 使用代码点到Unicode转换器Unicode查找(在搜索十六进制时,请添加0x)来将数字表示反向转换为Unicode字符(请记得将下面的代码点基数设置为十进制或十六进制)
  • Autohotkey中使用一行宏命令::?*:altpipe::{U+2D4F},以输入字符串altpipe时自动替换为字符 - 这是我输入这些特殊字符的方法,如果有共同兴趣,我可以分享我的Autohotkey脚本
  • Alt字符或按住alt键,然后输入所需字符的十进制数(更多信息请参考这里,查看表格这里那里)。对于这个例子,就是Alt+11599。请注意,许多程序不完全支持这个Windows功能的所有Unicode字符(截至撰写本文时)。公软件是一个例外,它通常可以正常工作,其他一些操作系统也提供类似的功能。在MS Word中使用Alt组合键输入这些字符也是Wally Brockway他已经提到的答案¹⁴中建议的方法 - 如果您不想将所有十六进制值转换为它们的十进制ASC码,您可以在那里¹⁴找到其中一些。
  • 在MS Office中,您还可以使用ALT + X,如这篇MS文章所述,来生成这些字符
  • 大多数操作系统都提供一个字符映射工具,您可以在其中找到特殊字符,通常它们还包括按名称搜索的选项
  • 如果您很少需要它,当然还可以直接复制粘贴您选择的特殊字符,而不是输入它

更多可能的选择和研究笔记

你对更宽的字符不满意吗?有很多替代方案。请注意:十六进制数表示对大小写不敏感,前导零可以随意添加或省略,所以例如U+002Au+2a是等效的。如果有的话,我会尽量指出更多信息或替代方案-请随时向我展示更多或更好的选择。

  1. 不要使用*U+2A * ASTERISK),你可以使用列出的众多选项之一,例如U+2217 ∗(ASTERISK OPERATOR)全角星号U+FF0A *符号的组合变音符号中的u+20f0 ⃰ combining asterisk above也是一个有效的选择。关于组合字符的更多信息,请参阅第4点。

  2. 不要使用.U+2E . full stop),你可以选择这些选项之一,例如⋅ U+22C5 dot operator

  3. 不要使用"U+22 " quotation mark),你可以使用“ U+201C english leftdoublequotemark,更多的替代方案请参见这里。我还包括了Wally Brockway的回答中的一些建议,例如u+2036 ‶ reversed double primeu+2033 ″ double prime - 从现在开始,我将用¹⁴来表示该来源的想法。

  4. 不要使用/U+2F / SOLIDUS),你可以使用∕ DIVISION SLASH U+2215(其他选项在这里)或u+2044 ⁄ fraction slash¹⁴。你还可以尝试使用̸ U+0338 COMBINING LONG SOLIDUS OVERLAY̷ COMBINING SHORT SOLIDUS OVERLAY U+0337,但要注意一些字符的间距,包括combiningoverlay字符。它们本身没有宽度,可能会产生像这样的结果 --> ̸th̷is,即̸_th̷_is(为了说明,在这6个字符中添加了下划线)。添加空格后,你会得到 --> ̸ th ̷ is,即̸ _th ̷ _is(加了两个空格,总共8个字符)。第二个(COMBINING SHORT SOLIDUS OVERLAY)在stackoverflow字体中看起来很糟糕。

  5. 不要使用\U+5C Reverse solidus),你可以使用⧵ U+29F5 Reverse solidus operator 更多选项)或u+20E5 ⃥ combining reverse solidus overlay¹⁴

  6. 要替换[U+5B [ Left square bracket)和]U+005D ] Right square bracket),你可以使用例如U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETU+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET(来自这里,更多选择在这里)。

  7. 不要使用:u+3a : colon),你可以使用U+2236 ∶ RATIO(用于数学用途)U+A789 ꞉ MODIFIER LETTER COLON(参见冒号(字母),有时在Windows文件名中使用,因为它与用于文件名的Segoe UI字体中的冒号相同。冒号本身是不允许的...更多的替代方案请参见这里)。另一个选择是u+1361 ፡ ethiopic wordspace¹⁴

  8. 不要使用;u+3b ; semicolon),你可以使用U+037E ; GREEK QUESTION MARK(参见这里)。

  9. 对于|u+7c | vertical line),有一些很好的替代品,例如:U+2223 ∣ DIVIDESU+0964 । DEVANAGARI DANDAU+01C0 ǀ LATIN LETTER DENTAL CLICK(最后两个来自维基百科),或者U+2D4F ⵏ Tifinagh Letter Yan方框绘图字符中还包含其他各种选项。

  10. 不要使用,, U+002C COMMA),你可以使用例如‚ U+201A SINGLE LOW-9 QUOTATION MARK(参见这里)。

  11. 对于?U+003F ? QUESTION MARK),这些是很好的候选项:U+FF1F ? FULLWIDTH QUESTION MARKU+FE56 ﹖ SMALL QUESTION MARK(来自这里这里)。Dingbats Block中还有两个(搜索“question”),以及u+203d ‽ interrobang¹⁴

  12. 虽然我的机器似乎可以接受它而不变,但为了完整起见,我还是想包括>u+3e greater-than sign)和<u+3c less-than sign)。这里最好的替代品可能也来自引用块,例如u+203a › single right-pointing angle quotation marku+2039 ‹ single left-pointing angle quotation mark。tifinagh块只包含ⵦ(u+2D66)¹⁴来替换<。最后一个提法是⋖ less-than with dot u+22D6⋗ greater-than with dot u+22D7

要获取更多的创意,你还可以参考这个区块的例子。你还想要更多的创意吗?你可以尝试画出你想要的角色,然后查看这里的建议。如果你发现有价值的东西,请留下评论。

1
我已经编写了一个程序,可在 https://github.com/DDR0/fuseblk-filename-fixer 上应用这些更改。如果有任何字符(或模式)被忽略,请告诉我! - DDR
2
如果Unicode联盟的“某个人”为“滥用非法字符的愚蠢操作系统”保留一个范围,并将其字体映射到“非法字符字形”,但又不同,那将是很好的。即使是对于?的替换,它们的宽度和特征也不同,这让我想要替换!并感到烦恼,因为即使在这种情况下,高度也与“。”不一致。 - i30817
需要注意的是,虽然文件系统会接受这些“替代方案”,但它们很可能会在其他地方引起问题。我在文件路径中添加了U+FF3B,Windows没有任何问题。但是当我尝试在C#中使用System.IO.File.ReadAllBytes时,它崩溃了。因此,这些绝对不应该被用作规避文件系统限制的解决方法。 - Heriberto Lugo
1
这是我所做的事情,但我只是使用全角字符选项来完成它们。虽然不太漂亮,但总是有效且更容易记住。我只需在Windows字符映射辅助工具中搜索“全角”即可。半角也是一个选择,但对我来说,全角选项看起来更好一些。但我同意在Unicode中添加一个7位ASCII重复范围的建议,或者Windows可以使用其中一个私有范围... - Bill Sellers
@BillSellers 我在半角字符类别中没有找到太多有用的内容。而且你可能会对我最新的编辑感兴趣。 - Cadoiz
1
@DDR 如果你愿意的话,你可以考虑最近的编辑。 - undefined

14

对于Windows,您可以使用PowerShell进行检查

$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars
显示UTF-8代码,您可以进行转换。
$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }

$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference

2
对于那些不会使用PowerShell的人来说,$FileNameInvalidChars是0x00到0x1F,以及:"< > | * ? \ /"。 - Robin Davies
(“< > |”对路径和文件都无效) - Cadoiz

11

寻找正则表达式的人:

const BLACKLIST = /[<>:"\/\\|?*]/g;

7

在Windows 10(2019年版)中,当您尝试输入以下字符时,会出现错误并禁止输入:

文件名不能包含以下任何字符:

\ / : * ? " < > | enter image description here


3
可能是重复的问题,参考链接:https://dev59.com/snI-5IYBdhLWcg3wMFS0#32565700 - Cadoiz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接