2017-04-18 1 views
0

HtmlAgilityPack을 사용하는 몇 개의 사이트에서 메타 설명을 읽습니다.C#에서 비 ASCII 문자가 디코딩되는 이유는 무엇입니까?

영어 문자가 아닌 경우 특수 문자가 디코딩되지 않습니다. (예 : 일본 편지).

인코딩 UTF8을 사용하고 있습니다. 다른 것을 사용해야합니까?

byte[] bytes = Encoding.Default.GetBytes(item.Attributes["content"].Value); 
return Encoding.UTF8.GetString(bytes); 
+2

? 또한 왜 당신은'return item.Attributes [ "content"]. –

+0

item.Attributes [ "content"]. 값을 반환하면 Japaneses 문자가 표시되지 않습니다. v ̌ R ~ @ScottChamberlain – Ben

+0

어떻게 표시하고 있습니까? 그 코드를 보여주세요. 또한'Value'가 반환 한'string' 객체를 검사하십시오. 디버거에서 문자열을 검사하여 올바른 값을 가지고 있는지 확인하십시오. 올바른 값을 가지고 있지 않다면, 다시 돌아가서'item'이 당신의 데이터 소스가 무엇이든지간에 파싱을하지 않는 이유를 찾아야합니다. –

답변

0

귀하의 의견에 따르면 귀하의 웹 사이트가 UTF-8이 아닌 SHIFT-JIS 인코딩을 사용하고있는 것으로 보입니다. UTF-8 및 SHIFT-JIS에 대해 두 개의 샘플을 추가했습니다.

 using (var client = new WebClient()) 
     { 
      // UTF-8 
      var content = client.DownloadString("http://www3.nhk.or.jp/news/"); 
      var doc = new HtmlDocument(); 
      doc.LoadHtml(content); 
      var metaDescNode = doc.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]"); 
      var bytes = Encoding.Default.GetBytes(metaDescNode.Attributes["content"].Value); 
      var decodedMetaDesc = Encoding.UTF8.GetString(bytes); // This string has decoded characters 

      // Shift_JIS 
      var japaneseEncoding = Encoding.GetEncoding(932); 
      var content2 = client.DownloadString("http://www.toronto-electricians.com/"); 
      var doc2 = new HtmlDocument(); 
      doc2.LoadHtml(content2); 
      var metaDescNode2 = doc2.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]"); 
      var bytes2 = Encoding.Default.GetBytes(metaDescNode2.Attributes["content"].Value); 
      var decodedMetaDesc2 = japaneseEncoding.GetString(bytes2); // This string has decoded characters 
     } 

스크린 샷 # 1 디버거에서. 디버거에서

enter image description here

스크린 샷 # 2.

enter image description here

+0

샘플에서 사용한 사이트에서 코드가 작동합니다. 나는 다른 웹 사이트'http : // www.toronto-electricians.com/' 그리고 v ̌ R ~ shows를 보여줍니다. 내 사이트에서 코드를 실행할 수 있습니까? 너에게 괜찮은가? – Ben

+0

아! 귀하의 사이트는 "Shift_JIS"문자 세트를 사용하여 코드를 업데이트합니다. – Ignas

+0

@Ben 업데이트 된 코드를 확인하십시오. – Ignas

1

WebClient.DownloadString는 어려운 오류가 발생하기 쉬운 근본적 간단한 작업을 수행 할 수있게 제한 고수준 방법.

HTTP를 통해 웹 페이지를 가져 오는 것은 간단합니다. URL과 일부 요청 헤더를 제공합니다. 서버는 응답 헤더와 본문의 바이트 스트림으로 응답합니다. 응답 헤더는 일반적으로 텍스트 본문의 문자 인코딩을 나타냅니다. 그렇지 않으면 텍스트 본문 자체가 말할 수 있습니다. HTMLAgilityPack은이를 이해하고 해당 상호 작용에서 HtmlAgilityPack.HtmlDocument를 만들 수있는 HtmlWeb 클래스를 제공합니다.

왜 전혀`Encoding.Default`를 사용하는
var document = new HtmlWeb().Load("http://www3.nhk.or.jp/news/"); 
var keywords = document.DocumentNode 
    .SelectSingleNode("//meta[@name='keywords']") 
    .Attributes["content"]?.Value; 
Console.WriteLine(keywords); 
Console.WriteLine([email protected]" 
    StreamEncoding: {document.StreamEncoding?.EncodingName} 
    DeclaredEncoding: {document.DeclaredEncoding?.EncodingName} 
    Encoding:   {document.Encoding?.EncodingName}"); 

NHK,ニュース,NHK NEWS WEB 

    StreamEncoding: Unicode (UTF-8) 
    DeclaredEncoding: 
    Encoding:   Unicode (UTF-8) 
+0

url을 사용하여 코드를 실행 해 보았습니다. http : // www.toronto-electricians.com /'SHIFT-JIS 인코딩이 작동하지 않습니다. 반환 ̉ グ – Ben

+0

@ 벤 순간. 귀하의 페이지를 [W3C 검사기] (https://validator.w3.org/check?uri=http%3A%2F%2Fwww.toronto-electricians.com%2F&charset=%28detect+automatically%29&fbc=1&doctype)에 넣었습니다. = Inline & fbd = 1 & group = 1 & ss = 1 & outline = 1 & No200 = 1 & verbose = 1) XHTML에서 실패합니다. 그러나 HtmlAgilityPack이 캐릭터를 괴롭히는 원인이 될 것은 없습니다. –

+0

@Ben, 계층화 된 스펙을 구문 분석하기는 어렵지만 서버가 charset 선언없이 HTTP Content-Type 헤더를 보내고 있습니다. charset 선언이있는 HTTP Content-Type 헤더는 HTML/XHTML 메타 문자 세트 선언을 무시합니다. 헤더가 있지만 문자 세트가 없으면 대체가 UTF-8의 기본값으로 수행됩니다. Content-Type 헤더에 charset을 포함하도록 서버를 변경할 수 있습니까? –

관련 문제