【问题标题】:Finding a parsing API for partially utf8 encoded URL's为部分 utf8 编码的 URL 查找解析 API
【发布时间】:2008-12-11 16:25:31
【问题描述】:

在解析某些网页的 HTML 时(尤其是任何 Windows Live 页面),我会遇到很多以下格式的 URL。

http\x3a\x2f\x2fjs.wlxrs.com\x2fjt6xQREgnzkhGufPqwcJjg\x2fempty.htm

这些似乎是部分 UTF8 转义字符串(\x2f = /、\x3a=: 等……)。是否有可用于将这些字符串转换为 System.Uri 的 .Net API?似乎很容易解析,但我今天试图避免建造一个新轮子。

【问题讨论】:

标签: c# .net uri


【解决方案1】:

您发布的内容不是有效的 HTTP。因此,HttpUtility.UrlDecode() 当然是行不通的。但不管怎样,您都可以将其转回正常文本,如下所示:

string input = @"http\x3a\x2f\x2fjs.wlxrs.com\x2fjt6xQREgnzkhGufPqwcJjg\x2fempty.htm";
string output = Regex.Replace(input, @"\\x([0-9a-f][0-9a-f])",
    m => ((char) int.Parse(m.Groups[1].Value, NumberStyles.HexNumber)).ToString());

但请注意,这是假定编码是 Latin-1 而不是 UTF-8。您提供的输入在这方面没有定论。如果需要 UTF-8 才能工作,则需要稍长的路由;您必须将字符串转换为字节,并将转义序列替换为进程中的相关字节(可能需要一个 while 循环),然后在生成的字节数组上使用 Encoding.UTF8.GetString()

【讨论】:

  • 你是什么意思 UTF-8 工作 ?他有一个默认为 unicode 的字符串。你可以解释吗? (附:+1)
  • @RoyiNamir:他的示例仅包含 ASCII 字符。目前还不清楚他希望如何对非 ASCII 字符进行编码,比如说á。如果它被编码为 \xe1,那么它就是 Latin-1(不是 Unicode)。如果它被编码为\xc3\xa1,那么它是UTF-8,这意味着几个字节用于编码单个字符。由于他的编码似乎在\x 之后采用两个十六进制数字,因此不能使用 UTF-16 或 UTF-32。
  • 如果我在控制台\xe1 中写入,它代表的是unicode char 还是utf8 编码? js是怎么处理的?
【解决方案2】:

这是另一个解决方案:(从@timwi 解决方案继续)

string output = Regex.Replace(input, @"\\x([0-9a-f][0-9a-f])",
            m => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString());

【讨论】:

    【解决方案3】:

    你试过HttpUtility.UrlDecode吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 2021-12-21
      相关资源
      最近更新 更多