WebClient.DownloadString(url)不能用于unicode字符(如波斯语)的url

本文关键字:url 波斯语 字符 不能 DownloadString WebClient 用于 unicode | 更新日期: 2023-09-27 17:54:49

我正试图从一个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);
}

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

编辑:两个答案都工作了,现在我正在测试其他网站。问题是一个特定的网站,我试图得到它的内容。网站能阻止这类请求吗?或者使用其他编码?

你建议我怎么做?

WebClient.DownloadString(url)不能用于unicode字符(如波斯语)的url

尝试将url字符串转换为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);
}

默认的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/طراحی——وب——سایت——آتلیه/网站/工作室

编辑:我做了一些研究,看到WebClientWebRequest如何处理字符编码存在差异。链接到相关文章

尝试从WebClient切换到WebRequest,看看是否解决了你的编码问题。

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

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));