WebClient.DownloadString(url)不适用于使用波斯语等单字符字符的网址

时间:2016-07-04 15:56:53

标签: c# url

我正在尝试从包含波斯语字符的网址中获取html内容,例如:

  

http://example.com/%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%88%D8%A8-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A2%D8%AA%D9%84%DB%8C%D9%87/website/Atelier

我正在使用此代码:

using (WebClient client = new WebClient())
{
    client.Encoding = Encoding.UTF8;
    string data = client.DownloadString(urlTextWithPersianCharacters);
}

当网址是这样的时候,我会得到不可读的字符和符号。此代码适用于其他具有英文网址和波斯文内容的网站。

编辑:现在我发现我正在测试其他网站。问题在于我正在尝试获取其内容的一个特定网站。网站可以阻止这些类型的请求吗?或者使用其他编码?

你建议我做什么?

3 个答案:

答案 0 :(得分:0)

默认System.Text.UTF8Encoding类只能执行UTF-8格式的直接二进制解码。在您的示例中,您正在尝试解码使用“URL编码”的URL。

使用带有%符号作为标记的十六进制编码将特殊字符编码到URL中时,会发生URL编码。

要解决此问题,您需要将URL解码为UTF-8字符串。

System.Net.Uri.UnescapeDataString()方法应该可以为您服务。

string url = "http://example.com/%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%88%D8%A8-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A2%D8%AA%D9%84%DB%8C%D9%87/website/Atelier";
string result = Uri.UnescapeDataString(url);

在此示例中,结果包含:http://example.com/طراحی-وب-سایت-آتلیه/website/Atelier

修改:我做了一些研究,发现WebClientWebRequest处理字符编码的方式存在差异。Link to relevant article

尝试从WebClient切换并使用WebRequest,看看是否能解决编码问题。

答案 1 :(得分:0)

尝试将您的网址字符串转换为URI:

       Uri uri = new Uri("http://example.com/%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D9%88%D8%A8-%D8%B3%D8%A7%DB%8C%D8%AA-%D8%A2%D8%AA%D9%84%DB%8C%D9%87/website/Atelier");
using (WebClient client = new WebClient())
{
    client.Encoding = Encoding.UTF8;
    string data = client.DownloadString(uri);
}

答案 2 :(得分:0)

有很多方法和解决方案。尝试哪一个适合您的需要

string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));