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和波斯语内容的网站。
编辑:两个答案都工作了,现在我正在测试其他网站。问题是一个特定的网站,我试图得到它的内容。网站能阻止这类请求吗?或者使用其他编码?
你建议我怎么做?
尝试将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/طراحی——وب——سایت——آتلیه/网站/工作室
编辑:我做了一些研究,看到WebClient
和WebRequest
如何处理字符编码存在差异。链接到相关文章
尝试从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));