在查询字符串值中使用的分隔符

时间:2009-03-13 13:41:35

标签: string query-string delimiter

我需要接受查询字符串中的文件名列表。即:

http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc

您对使用哪个分隔符有什么建议吗?

8 个答案:

答案 0 :(得分:21)

多次查询参数是合法的,并且是在所有情况下都不保证解析问题的唯一方法:

http://someSite/someApp/myUtil.ashx?file=file1.txt&file=file2.bmp&file=file3.doc

如果文件名的一部分(转为;),则分号%3B必须进行URI编码,但如果分隔的是查询参数,则必须对其进行URI编码。

参见this rfc的第2.2节:

  

2.2。保留字符

     

URI包括由分隔的组件和子组件      “保留”集中的字符。这些字符被调用      “保留”因为它们可能(或可能不)被定义为分隔符      通用语法,每种特定于方案的语法,或者由      URI的解除引用算法的特定于实现的语法。      如果URI组件的数据与保留的数据冲突      字符作为分隔符的目的,那么冲突的数据必须是      在URI形成之前进行百分比编码。

 reserved    = gen-delims / sub-delims

 gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

 sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="

答案 1 :(得分:14)

如果它们是文件名,那么一个好的选择将是文件名中不允许的字符。到目前为止的建议包括, | &,这些建议通常在文件名中允许,因此可能会导致含糊不清。另一方面,/通常是不被允许的,即使在Windows上也是如此。它在URI中是允许的,它在查询字符串中没有特殊含义。

示例:

http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc不好,因为它可能会引用有效文件file1.txt|file2.bmp

http://someSite/someApp/myUtil.ashx?files=file1.txt/file2.bmp/file3.doc明确指出3个文件。

答案 2 :(得分:7)

我建议将每个文件设为自己的查询参数,即

myUtil.ashx?file1=file1.txt&file2=file2.bmp&file3=file3.doc

这样您就可以使用标准查询解析和循环

答案 3 :(得分:6)

您是否需要将文件名列为字符串? 大多数语言接受查询字符串中的数组,因此您可以像

一样编写它
http://someSite/someApp/myUtil.ashx?files[]=file1.txt&files[]=file2.bmp&files[]=file3.doc

如果没有,或者由于其他原因而无法使用,则应该坚持使用文件名中不允许或不常见的分隔符。 Pipe(|)是一个很好的,否则你可以对一个不可见的字符进行urlencode,因为它们很容易在编码中使用,但实际上很难包含在文件名中。

我通常在可能的情况下使用数组,否则使用数据。

答案 4 :(得分:5)

我一直使用双管“||”。我没有任何好的证据来支持为什么这是一个很好的选择,而不是10年的网络编程,它从来都不是问题。

答案 5 :(得分:1)

这是一个常见问题。我是如何处理它的:我创建了一个接受字符串列表的方法,然后找到了一个不在任何字符串中的字符。 (我通过字符串的简单连接,然后测试各种字符来完成此操作。)一旦找到一个字符,将所有字符串连接在一起,但也在字符串前面加上分隔字符。所以在给定的问题中,一个例子是: http://someSite/someApp/myUtil.ashx?files=|file1.txt|file2.bmp|file3.doc 另一个是: http://someSite/someApp/myUtil.ashx?files=,file1.txt,file2.bmp,file3.doc 但是因为我实际上使用的方法保证我的分隔符不在其余的字符串中,所以它是安全的。第一次创建是一项工作,但我已经在各种应用程序中使用了很多次。

答案 6 :(得分:0)

我想我会考虑使用逗号或分号。

答案 7 :(得分:0)

我会建立在MSalters的回答上说,总的来说,最好的分隔符是对列表中的项目无效的分隔符。例如,如果您的列表是价格,则逗号是一个错误的分隔符,因为它可能与值混淆。出于这个原因,正如大多数这些答案所暗示的那样,我认为一个好的通用分隔符可能是“|”因为它很少是有效值。 “/”通常可能不是最好的分隔符,因为它有时对路径有效。