[FDBS] 페이지 디코딩, 인코딩 (Cheerio)

Jay ·2023년 3월 8일
0

외국어(중국어)로 된 페이지를 파싱하여 번역할려고 하던 도중
파싱한 텍스트가 깨지는 현상이 일어났다.

원인을 찾아보니, Fetch로 웹페이지의 HTML을 가져올 경우 기본적으로 Content-Type 헤더가 text/plain;charset=UTF-8로 기본 설정된다고 한다.

해당 페이지가 GBK로 작성되어 있었기 때문에

에러가 발생한 것으로 추측된다.

Goal

특정 타입으로 인코딩된 웹 페이지 Decode.

Approach

step 1

현재 웹페이지의 인코딩을 먼저 확인해야 한다 .

document.characterSet
/// 'GBK' => 중국어 인코딩 타입

step 2

웹페이지의 인코딩 타입을 확인했으니, Decode를 해야하는데 여러 옵션이 있지만 TextDecoder가 최선의 선택지인듯.
TextDecoder

const responseText = await fetch(prompt);
const buffer = await responseText.arrayBuffer();
const decoder = new TextDecoder("gbk");
const htmlString = decoder.decode(buffer);
const $ = cheerio.load(htmlString);

원하는 결과는 TextDecoder을 사용해 decode된 response data를 가져오는 것.

TextDecoder는 Binary data를 input으로 받기 때문에
fetch의 Response를 Binary로 변환해야 한다.

Arraybuffer를 사용해 데이터를 binary로 변환.

변환한 데이터를 TextDecoder("해당언어코드")로 추출

끝.

Realted topics

ArrayBuffer? Buffer?

Binary data? stream?

profile
Jay입니다.

0개의 댓글