DownloadString和特殊字符

3

我正在尝试在一个使用WebClient和DownloadString下载的字符串中找到“Mauricio”的索引。然而,在网站上它包含一个外国字符“Maurício”。因此,我在其他地方找到了一些代码。

string ToASCII(string s)
{
return String.Join("",
     s.Normalize(NormalizationForm.FormD)
    .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark));
}

这段代码可以转换外文字符。我已经测试过它并且它可以正常工作。但是,当我下载该字符串时,它会下载为MaurA-cio。我已经尝试了以下两种方法:

wc.Encoding = System.Text.Encoding.UTF8; wc.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");

但是仍然无法阻止它下载为MaurA-cio。

(另外,我不能更改搜索条件,因为我从一个列表中获取搜索词)。

我还能尝试什么?谢谢。


你应该把normalize方法放在join方法之外调用,不是吗? - Eric
我不这么认为。目前的转换可以正确将Maurício转换为Mauricio。 - drj3122
正确。目前使用DownloadString,外文字符无法正确下载。í变成A-。 - drj3122
规范化不会将ASCII无法表示的字符转换为可以表示的字符,您甚至似乎在说ToASCII方法对于至少一个字符串(“Mauricio”)是不起作用的。您实际上想要完成什么任务?为什么首先要在代码中引入该方法ToASCII(因为它实际上并没有将字符串转换为ASCII)?如果您正在尝试将字符串转换为ASCII,则考虑到它无法用ASCII表示,您希望对字符串“Mauricio”做什么? - Peter Duniho
该答案的评论建议这可能是 .NET 3.5 中的一个 bug。 - kennyzx
2个回答

10
var client = new WebClient { Encoding = System.Text.Encoding.UTF8 };

var json = client.DownloadString(url);

这个可以适用于任何字符


2

DownloadString不会查看HTTP响应头,它使用之前设置的WebClient.Encoding属性。如果必须使用它,请先获取头信息:

// call twice 
// (or to just do a HEAD, see https://dev59.com/VnA75IYBdhLWcg3wfpGr)
webClient.DownloadString("http://en.wikipedia.org/wiki/Maurício");
var contentType = webClient.ResponseHeaders["Content-Type"];
var charset = Regex.Match(contentType,"charset=([^;]+)").Groups[1].Value;

webClient.Encoding = Encoding.GetEncoding(charset);
var s = webClient.DownloadString("http://en.wikipedia.org/wiki/Maurício");

顺便说一下,Unicode并没有定义“外国”字符。从Maurício的角度来看,“Mauricio”是他名字的外国拼写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接