외국어(중국어)로 된 페이지를 파싱하여 번역할려고 하던 도중
파싱한 텍스트가 깨지는 현상이 일어났다.
원인을 찾아보니, Fetch로 웹페이지의 HTML을 가져올 경우 기본적으로 Content-Type 헤더가 text/plain;charset=UTF-8로 기본 설정된다고 한다.
해당 페이지가 GBK로 작성되어 있었기 때문에
에러가 발생한 것으로 추측된다.
특정 타입으로 인코딩된 웹 페이지 Decode.
현재 웹페이지의 인코딩을 먼저 확인해야 한다 .
document.characterSet
/// 'GBK' => 중국어 인코딩 타입
웹페이지의 인코딩 타입을 확인했으니, 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("해당언어코드")로 추출
끝.