白衣非少年
这里的大多数现有答案都是不切实际的,因为它们完全忽略了地址在现实世界中的用法,例如:https://en.wikipedia.org/wiki/M bius条或https://zh.wikipedia.org/wiki/Wikipedia:关于中文维基百科/en.首先,对术语的偏离?什么是这些地址?它们是有效的URL吗?从历史上看,答案是“不”。根据RFC 3986,从2005年起,这些地址不是URI(因此也不是URL,因为URL)。是一种URI)。根据2005年IETF标准的术语,我们应该正确地称它们为IRIS(国际化资源标识符),如RFC 3987,它们在技术上不是URI,但可以通过对IRI中的所有非ASCII字符进行百分比编码来转换为URI。根据现代规范,答案是“。这个WHATWG生活水平简单地将以前被称为“URI”或“Iris”的所有内容归类为“URL”。这与没有阅读规范的正常人使用“URL”这个词是一致的,而URL是规范中的一个目标.根据WHATWG的生活标准,哪些角色是允许的?根据“URL”这个较新的意思,哪些字符是允许的?在URL的许多部分,例如查询字符串和路径中,我们可以使用任意的“URL单位”,它们是URL代码点和百分比编码字节.什么是“URL代码点”?这个URL代码点ASCII字母数字,U+0021(!),U+0024($),U+0026(&),U+0027(‘),U+0028左括号,U+0029右括号,U+002A(*),U+002B(+),U+002C(,),U+002D(-),U+002E(.),U+002F(/),U+003A(:),U+003B(;)、U+003D(=)、U+003F(?)、U+0040(@)、U+005F(_)、U+007E(~),以及在U+00A0到U+10 FFFD范围内的代码点,包括代名词和非字符。(请注意,“URL代码点”列表不包括%,但那%如果S是百分比编码序列的一部分,则允许使用“URL代码单元”。)我唯一能看到的地方是规范允许使用任何字符不在这个集合中是在寄主,其中IPv 6地址包含在[和]人物。在URL中的其他地方,要么允许URL单元,要么允许一些更严格的字符集。旧的RFCS允许哪些字符?为了历史的考虑,并且由于在这里的答案中没有对它进行充分的探索,让我们在旧的规范下进行检查。首先,我们有两种rfc 3986。保留字符::/?#[]@,这是rfc 3986中定义的URI的泛型语法的一部分。!$&'()*+,;=,它们不是RFC泛型语法的一部分,而是保留用于特定URI方案的语法组件。例如,分号和逗号作为数据URI,和&和=被用作无处不在的?foo=bar&qux=baz查询字符串中的格式(其中不是由RFC 3986指定)。上述任何保留字符都可以合法地在URI中使用,而无需编码,既可以用于语法目的,也可以作为数据中的文字字符使用,而在某些地方,这种使用不能被误解为其语法目的服务的字符。(例如,尽管/在URL中具有语法意义,您可以在查询字符串中使用它,因为它不在查询字符串中有意义。)RFC 3986还指定了一些亚细亚字符,这些字符总是可以简单地用于表示数据,而不需要进行任何编码:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~最后,%字符本身允许编码百分比.只剩下以下ASCII字符:禁出现在URL中:控制字符(chars0-1F和7F),包括新行、选项卡和回车。 "<>\^`{|}ASCII中的其他每个字符都可以合法地在URL中显示。然后,RFC 3987用以下Unicode字符范围扩展了这组非保留字符: %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
/ %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
/ %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
/ %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
/ %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
/ %xD0000-DFFFD / %xE1000-EFFFD考虑到最新的unicode,这些来自旧规范的块选择看起来很奇怪,也很武断。块定义这可能是因为自RFC 3987编写以来,这些区块在十年内增加了。最后,也许值得注意的是,仅仅知道哪些字符可以合法地出现在URL中并不足以识别某个给定的字符串是否是合法URL,因为有些字符仅在URL的特定部分是合法的。例如,保留字符[和]作为URL中IPv 6文字主机的一部分是合法的,如http://[1080::8:800:200C:417A]/foo但在任何其他情况下都是不合法的,所以OP的示例http://example.com/file[/].html是非法的。