2017-09-16 1 views
2

안녕하세요 :) WebClient에서 UTF-8을 반환하도록 열심히 노력하고 있습니다. 그러나 서브가 Ä과 같은 것을 반환해야한다면 더 많은 것이 E이거나 그렇게 생각합니다.C# WebClient가 UTF-8을 반환하지 않습니다.

많은 해결 방법을 시도했지만 작동하지 않습니다.

private string translate(string input, string languagePair) 
{ 
    string url = String.Format("https://translate.google.com/?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair); 
    WebClient wc = new WebClient(); 
    wc.Headers.Add(HttpRequestHeader.AcceptCharset, "UTF-8"); 
    wc.Encoding = Encoding.UTF8; 
    var data = wc.DownloadData(url); 
    var result = Encoding.UTF8.GetString(data); 
    //string result = wc.DownloadString(url); 
    int start = result.IndexOf("result_box"); 
    string sub = result.Substring(start); 
    sub = sub.Substring(0, sub.IndexOf("</span>")); 
    start = sub.LastIndexOf(">"); 
    sub = sub.Substring(start + 1); 
    return sub; 
} 
+1

입력 ('input' 및'languagePair')을 입력하십시오. –

+0

예제 입력 : would, lp : en | de 대신 wwrde가 반환됩니다 – koin

답변

4

구글은 단순히 AcceptCharset 헤더에 전송 인코딩을 무시하고 당신이 단축 응답에서 볼 수 있듯이, ISO-8859-1에 응답을 반환 : 당신이 UTF-8 인코딩을 사용하여 응답을 디코딩 할 때

HTTP/1.1 200 OK 
Content-Type: text/html; charset=ISO-8859-1 
Content-Language: en 
Content-Length: 64202 

<!DOCTYPE html><html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"> 

따라서, 당신이 잘못 얻을 문자. 당신이 신속하게 작동하도록 단지 싶은 경우에, 나는 User-Agent 헤더는 요청에 추가 될 때, 구글은 UTF-8에서 응답을 반환 것으로 나타났습니다 당신은 수정되지 않은 코드의 나머지 부분을 떠날 수 :

private static string translate(string input, string languagePair) 
{ 
    string url = String.Format("https://translate.google.com/?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair); 
    WebClient wc = new WebClient(); 
    wc.Headers.Add(HttpRequestHeader.AcceptCharset, "utf-8"); 
    wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/55.0"); 
    wc.Encoding = Encoding.UTF8; 
    string result = wc.DownloadString(url); 
    int start = result.IndexOf("result_box"); 
    string sub = result.Substring(start); 
    sub = sub.Substring(0, sub.IndexOf("</span>")); 
    start = sub.LastIndexOf(">"); 
    sub = sub.Substring(start + 1); 
    return sub; 
} 

더 나은 솔루션을 감지하는 것입니다 응답에 사용 된 인코딩을 디코딩에 사용합니다. WebClient는 내장이 검출이없는, 그래서 당신은 하나를 사용 솔루션은 here을 설명하거나 자동으로이 작업을 수행하는 대신 HttpClient을 사용

또한
private static async Task<string> translate(string input, string languagePair) 
{ 
    string url = String.Format("https://translate.google.com/?hl=en&ie=UTF8&text={0}&langpair={1}", input, languagePair); 
    using (var hc = new HttpClient()) 
    { 
     var result = await hc.GetStringAsync(url).ConfigureAwait(false); 
     int start = result.IndexOf("result_box"); 
     string sub = result.Substring(start); 
     sub = sub.Substring(0, sub.IndexOf("</span>")); 
     start = sub.LastIndexOf(">"); 
     sub = sub.Substring(start + 1); 
     return sub; 
    } 
} 

에 더 좋을 수도있는 구글이 Translation API을 가지고 유의하시기 바랍니다 HTML 페이지에서 번역을 구문 분석하는 대신에 사용하십시오.

+0

고맙습니다! – koin

관련 문제