2011-04-22 6 views
2

이 코드가 : 임 크롤링 다른 캐릭터 세트 가질 수NodeJS에서 인코딩을 인코딩/디코딩하는 방법은 무엇입니까?

request({ url: 'http://www.myurl.com/' }, function(error, response, html) { 
    if (!error && response.statusCode == 200) { 
    console.log($('title', html).text()); 
    } 
}); 

그러나 웹 사이트 (UTF8, ISO-8859-1, 등)을 얻을 인코딩 /를 항상 HTML을 디코딩하는 방법 오른쪽 인코딩 (utf8)?

덕분에 나의 영어에 대한 죄송 함)

+0

그럼 내가 요청에 대한 옵션'encoding'를 사용할 수 있다는 것을 알고 있지만, 문제는 내가 (내가 헤더 또는 메타 태그로 알고있는) 페이지의 또 문자 집합을 잘 모릅니다 다음은 전체 예제 – William

답변

0

첫번째로, 다른 캐릭터 세트에 데이터를 보낼 웹 사이트되지 못할 수락-캐릭터 세트 헤더를 보낼 수 있습니다. 당신이 응답을하면

, 당신은 캐릭터 세트 항목에 대한 콘텐츠 형식 헤더를 확인하고 적절한 처리를 할 수 있습니다.

콘텐츠 인코딩을 알 수 없을 때 Anothr hack (나는 과거에 사용했습니다)은 가능한 모든 콘텐츠 인코딩을 사용하여 디코딩하고 예외를 throw하지 않는 것을 사용합니다 (파이썬에서 사용).

+0

다음 페이지에서 발표 된 모듈을 사용해 볼 수도 있습니다. http://groups.google.com/group/nodejs/browse_thread/thread/38dc4444b2e1436c 여기 직접 링크가 있습니다. https://github.com/franzenzenhofer/whatlang – dhruvbird

2

콘텐츠 형식 헤더의 콘텐츠 인코딩 또는 반환 된 HTML 내부의 콘텐츠 형식 메타 태그, 예를 들어, 반환 할 수 웹 사이트 :

<meta http-equiv="Content-Type" content="text/html; charset=latin1"/> 

당신은 자동으로이 두 가지를 확인하기 위해 charset 모듈을 사용할 수 있습니다 너를 위해서. 모든 웹 사이트 또는 서버가 인코딩을 지정하지는 않으므로 데이터 자체에서 문자 세트를 감지하는 것으로 넘어 가고 싶을 것입니다. jschardet 모듈을 통해 도움을받을 수 있습니다.

일단 캐릭터 세트를 해결하면 iconv 모듈을 사용하여 실제 변환을 수행 할 수 있습니다.

request({url: 'http://www.myurl.com/', encoding: 'binary'}, function(error, response, html) { 
    enc = charset(response.headers, html) 
    enc = enc or jchardet.detect(html).encoding.toLowerCase() 
    if enc != 'utf-8' 
     iconv = new Iconv(enc, 'UTF-8//TRANSLIT//IGNORE') 
     html = iconv.convert(new Buffer(html, 'binary')).toString('utf-8') 
    console.log($('title', html).text()); 
}); 
관련 문제