如何在.NET中正确转义文档名称?
我们在我们的Web服务器(人们上传它们)上存储了一堆奇怪的文档名称,这些文档名称包含空格,符号等各种字符。当我们生成这些文档的链接时,我们需要将它们转义,以便服务器可以通过以下方式查找文件:它在数据库中的原始名称。 但是,在所有情况下,内置的.NET转义函数都不会正常工作。
拿文件Hello#There.docx
:
UrlEncode
将正确处理此问题:
HttpUtility.UrlEncode("Hello#There"); "Hello%23There"
但是, UrlEncode
无法正确处理Hello There.docx
:
HttpUtility.UrlEncode("Hello There.docx"); "Hello+There.docx"
+
符号仅对URL参数有效,而不对文档名称有效。 有趣的是,这实际上适用于Visual Studio测试Web服务器,但不适用于IIS。
UrlPathEncode
函数适用于空格:
HttpUtility.UrlPathEncode("Hello There.docx"); "Hello%20There.docx"
但是,它不会逃避其他字符,如#
字符:
HttpUtility.UrlPathEncode("Hello#There.docx"); "Hello#There.docx"
此链接无效,因为#
被解释为URL哈希,甚至从未到达服务器。
是否有.NET实用程序方法来转义文档名称中的所有非字母数字字符,或者我是否必须自己编写?
看看Uri.EscapeDataString方法 :
Uri.EscapeDataString("Hello There.docx") // "Hello%20There.docx" Uri.EscapeDataString("Hello#There.docx") // "Hello%23There.docx"
我会以不同的方式处理它:不要在查找中使用文档名作为键 – 使用Guid或其他一些id参数,您可以映射到数据库中磁盘上的文档名。 这不仅保证了唯一性,而且你也不会首先遇到这种逃避问题。
您可以使用@ character来转义字符串。 请参阅以下代码段。
string str = @"\n\n\n\n"; Console.WriteLine(str);
输出:\ n \ n \ n \ n
string str1 = @"\df\%%^\^\)\t%%"; Console.WriteLine(str1);
输出:\ df \ %% ^ \ ^)\ t %%
这种格式对于路径名和创建正则表达式非常有用。