출처 : http://blog.naver.com/techshare/100188366798
다음과 같이 간단한 테스트를 해보면, string txt = "http://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7"; WebClient wc = new WebClient(); string doc = wc.DownloadString(txt); doc 변수에는 깨진 한글이 들어 있는 것을 볼 수 있습니다. Fiddler를 이용해 확인하면 다음과 같이 charset이 UTF-8임을 확인할 수 있습니다. HTTP/1.0 200 OK
X-Content-Type-Options: nosniff
Content-Language: ko
Last-Modified: Tue, 10 Sep 2013 06:49:17 GMT
Content-Length: 89896
Content-Type: text/html; charset=UTF-8
...[생략]...
Connection: keep-alive
WebClient 객체의 기본 인코딩 객체는 wc.Encoding 속성으로 알 수 있는데 "SBCSCodePageEncoding"이기 때문에 한글이 깨지는 문제가 발생하는 것입니다. (한글 윈도우의 경우 "DBCSCodePageEncoding"입니다.) 따라서, 다음과 같이 명시적으로 utf-8을 설정해 주면 한글이 깨지는 문제가 해결됩니다. string txt = "http://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7"; WebClient wc = new WebClient(); wc.Encoding = Encoding.UTF8; string doc = wc.DownloadString(txt); 하지만 이 방법에는 단점이 하나 있습니다. HTML 페이지를 구하는 대상을 알고 있는 경우 이렇게 UTF-8로 정할 수 있겠지만, 무작위 웹 페이지의 경우에는 운에 맡겨지게 됩니다. 따라서, 대상 웹 페이지의 인코딩이 정해지지 않은 경우 어쩔 수 없이 DownloadString이 아닌 DownloadData를 사용한 후 응답 헤더의 Content-Type에 지정된 인코딩 값을 읽어와서 그에 맞게 디코딩해주는 식으로 구현을 해야 합니다. 아래의 코드는 이에 대한 간략한 구현이니 참고하세요. ^^ WebClient wc = new WebClient(); string url = "http://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%EB%84%B7"; byte [] docBytes = wc.DownloadData(url); string encodeType = wc.ResponseHeaders["Content-Type"]; string charsetKey = "charset"; int pos = encodeType.IndexOf(charsetKey); Encoding currentEncoding = Encoding.Default; if (pos != -1) { pos = encodeType.IndexOf("=", pos + charsetKey.Length); if (pos != -1) { string charset = encodeType.Substring(pos + 1); currentEncoding = Encoding.GetEncoding(charset); } } string doc = currentEncoding.GetString(docBytes); // 대상 웹 서버가 인코딩한 설정으로 디코딩!
|