-
[Node.js] 인코딩 - encodeURI(), charset=utf-8생활코딩/WEBn 2020. 9. 17. 22:12
URL의 인코딩
실습 중 한글 인코딩 관련해서 이슈가 발생했다.
먼저 코드 원문. 유저로부터 받은 post 데이터를 파싱해서 파일명 title인 파일을 생성하고, 유저를 해당 파일 페이지로 리다이렉트 한다.
fs.writeFile(`data/${post.title}`, content, 'utf8', function(err){ response.writeHead(302, {location: `/?id=${post.title}`}); response.end(); });
아래는 발생한 에러메세지.
_http_outgoing.js:512 throw new ERR_INVALID_CHAR('header content', name); ^ TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["location"] at storeHeader (_http_outgoing.js:465:5) at processHeader (_http_outgoing.js:460:3) at ServerResponse._storeHeader (_http_outgoing.js:363:11) at ServerResponse.writeHead (_http_server.js:312:8) at Object.redirect (/Users/hayjo/WEBn/nodeJS/main.js:22:14) at /Users/hayjo/WEBn/nodeJS/main.js:94:29 at FSReqCallback.oncomplete (fs.js:156:23) { code: 'ERR_INVALID_CHAR' }
이슈가 발생한 페이지 경로를 찍어보니 /%E3%85%87%E3%85%87 다.
테스트 페이지를 만들면서 title을 ㅇㅇ으로 했더니 redirect로 '/?id=ㅇㅇ'로 넘어가면서 인코딩이 깨진 것.
해결법은 해당 경로에 encodeURI() 적용하기. 아래를 참고했다.
developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/encodeURI#%EC%84%A4%EB%AA%85
수정한 코드. 문제없이 동작한다.
fs.writeFile(`data/${post.title}`, content, 'utf8', function(err){ response.writeHead(302, {location: encodeURI(`/?id=${post.title}`)}); // /?id=%E3%85%87%E3%85%87 response.end(); });
데이터의 인코딩
실습환경인 맥에서는 기본 인코딩이 utf-8이어서 별다른 이슈가 없었지만,
윈도우의 경우는 데이터를 읽을 때 디폴트 인코딩이 달라서 html 데이터가 깨지는 경우가 있다고 한다.
아래처럼 response header값에 charset 속성을 지정해주면 해결된다.
response.writeHead(200, {'Content-Type':'text/plain; charset=utf-8'})
자세한 내용은 아래 블로그를 참고했다.
d2fault.github.io/2018/06/18/20180618-nodejs-encoding/
참조 사이트
URL 퍼센트 인코딩의 인코드/디코드 관련해서 테스트가 필요할 때 유용한 사이트.
웹사이트 상에서 바로 인/디코드 결과를 확인할 수 있다.
'생활코딩 > WEBn' 카테고리의 다른 글
[DNS] Domain Name System 개요 (0) 2020.09.28 [Node.js] 입출력 데이터의 보안 이슈 (0) 2020.09.18 [Node.js] 비동기/동기(Sync)와 콜백, request (0) 2020.09.15 [HTML] form (0) 2020.09.14 [Node.js] NPM, PM2 (0) 2020.09.14