【问题标题】:Translate url to a valid file name and back to url将 url 转换为有效的文件名并返回 url
【发布时间】:2011-05-24 07:38:48
【问题描述】:

我需要为我的用户访问的每个站点存储一些唯一的信息。 (实际上是他浏览过的网站的缩略图。)
这个缩略图(jpeg 文件)需要有一个名称来表明它代表哪个站点,以便以后可以查看。

你能推荐一个从 url 到有效文件名并返回的简单翻译吗?

示例:www.ibm.com 可以映射到 www_ibm_com

我不确定这是否总是适用于所有有效的网址,在某些情况下,网址具有非常复杂的查询字符串。

有没有好的正则表达式或c#库可以使用?

提前致谢,祝您幸福。

【问题讨论】:

    标签: c# url filenames


    【解决方案1】:

    首先值得指出的是“。”在文件名中是完全合法的,但“/”不是,所以虽然您引用的示例不需要翻译,但“www.ibm.com/path1/file1.jpg”会。

    一个简单的string.Replace 将是最好的解决方案 - 假设您可以找到一个在文件名中合法但在 url 中非法的字符。

    假设非法的 URL 字符是“§”(在 URL 中可能是合法的),那么你有:

    string.Replace("/", "§");
    

    翻译成文件名并且:

    string.Replace("§", "/");
    

    翻译回来。

    This page on URL Encoding 定义 URLS 的有效、无效和不安全(有效但具有特殊含义)字符。 ISO-Latin 设置 80-FF 十六进制(十进制 128-255)“上半部分”中的字符不合法,但在文件名中可能没问题。

    您需要对 URL 中位于无效文件名字符集中的每个字符执行此操作。您可以使用GetInvalidFileNameChars 获取此信息。

    更新

    假设您找不到合适的字符对,那么另一种解决方案是使用查找表。一列包含 URL,另一列包含生成的文件名。只要生成的名称是唯一的(GUID 就可以),您就可以进行双向查找以从一个到另一个。

    【讨论】:

    • @ChrisF - 您是否知道文件名中非法的合法 URL 字符是什么?如果我知道清单,我可以使用您的方法。知道去哪里看吗?
    • 这个方法可能有问题。例如,如果 '.' url 中无论如何都存在字符,这是一个有效的文件名字符,那么这可能会导致歧义。最好选择某种约定,类似于如何使用 % 将 URL 的特殊字符转换为它们的 ASCII 值。
    • @Gunner - 如果您阅读我的回答,我指出您需要找到一个合法文件字符但 URL 非法的字符。在这种情况下,它不能出现在 URL 中,因此可以安全地将“/”转换为。您需要对所有非法字符重复。
    • 我可以看到直接翻译可能比我最初计划的要复杂。您还有其他想法如何将 URL 与文件名相关联并返回到 URL?
    • @Julian - 查找表是最简单的。
    【解决方案2】:

    www.ibm.com 实际上是一个有效的文件名。更成问题的是斜线。因此,如果 URL 包含子目录,则需要翻译斜杠。

    主要的问题是可能重复。例如,ibm.com/path1_path2 和 ibm.com/path1/path2 都将转换为相同的值。

    我喜欢 ChrisF 的建议,即找到一个在文件名中合法但在 URL 中不合法的字符,尽管我什至不知道哪个字符(如果有的话)会超出我的想法。

    如果您没有找到这样的角色,那么您可能需要坚持使用不太可能的角色。

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2011-11-24
      • 2022-01-10
      • 1970-01-01
      相关资源
      最近更新 更多