哪些字符永远不会出现在网址中?

时间:2013-10-08 19:10:49

标签: xml url

我在XML文件中存储了大量的URL(大约100,000个)(以及其他一些数据)。它使用较少的URL工作得很好,但现在,XML文件变得非常大(因为标签和缩进)并且解析速度很慢。所以我考虑将所有URL分组到一个XML元素中,为此我需要一个分隔符。作为一个例子,我想从此开始:

<document>
  <bigGroupOfURLs>
    <OneURL>
      <nameOfData1>data1_1</nameOfData1>
      <nameOfData2>data1_2</nameOfData2>
      <URL>www.site1.com</URL>
    </OneURL>
    <OneURL>
      <nameOfData1>data2_1</nameOfData1>
      <nameOfData2>data2_2</nameOfData2>
      <URL>www.site2.com</URL>
    </OneURL>
  </bigGroupOfURLs>
  <someOtherData>...</someOtherData>
</document>

这样的事情(但不使用#):

<document>
  <bigGroupOfURLs>
    data1#data2#www.site1.com#data1#data2#www.site2.com
  </bigGroupOfURLs>
  <someOtherData>...</someOtherData>
</document>

这些URL将来自HTML文件中的标签,因此它们可以带有各种非标准字符。例如,以下是可能包含的示例:

<a href="http://ja.wikipedia.org/wiki/メインページ">メインページ</a>
<a href="http://en.wikipedia.org/wiki/Stack Overflow">Stack Overflow</a>

在那里,我们可以看到UTF-8字符和空格。这些URL被正确解释,我想在它们出现时存储它们。那么,保证哪个字符永远不会出现在URL中?我希望它是一个可打印的角色。请注意,这将在XML文件中,因此我可能不应使用字符</>

2 个答案:

答案 0 :(得分:1)

您提到的两个网址实际上都是无效的:

http://ja.wikipedia.org/wiki/メインページ
http://en.wikipedia.org/wiki/Stack Overflow

如果您在浏览器中键入它们,它们将在发送到服务器之前进行百分比编码。根据{{​​3}},空格字符和以下可打印的ASCII字符在URL中无效:

" < > \ ^ ` { | }

多字节UTF-8序列也是无效的。也就是说,某些服务器可能仍然接受这些字符。

所以我建议你RFC 3986并用空格分隔它们。

答案 1 :(得分:1)

“URL”的定义不止一个。通常,术语用于“URI”或“IRI”更正确的地方。许多系统试图允许并允许根据规格在技术上不合法的东西; Postel的法律在这里适用,其不可避免的后果是,如果某些制度开始对他们所接受的东西持开放态度,那么其他所有人都必须效仿。

要使用的一个非常安全的分隔符是单个空格,尤其是如果您注意确保URL中的任何空格正确地% - 编码为%20。

但是在使用像这样的微语法之前,我希望确信XML解析时间确实是瓶颈。