我正在尝试从包含波斯语字符的网址中获取html内容,例如:
我正在使用此代码:
using (WebClient client = new WebClient())
{
client.Encoding = Encoding.UTF8;
string data = client.DownloadString(urlTextWithPersianCharacters);
}
当网址是这样的时候,我会得到不可读的字符和符号。此代码适用于其他具有英文网址和波斯文内容的网站。
编辑:现在我发现我正在测试其他网站。问题在于我正在尝试获取其内容的一个特定网站。网站可以阻止这些类型的请求吗?或者使用其他编码?
你建议我做什么?
答案 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
修改:我做了一些研究,发现WebClient
和WebRequest
处理字符编码的方式存在差异。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));