2021년 11월 작성, 2026년 10월 보완. 원래 글은 «EUC-KR로 저장해도 충분하다»고 했지만, 한국어 Windows가 쓰는 코드 페이지는 EUC-KR을 확장한 CP949다. EUC-KR로는 표현하지 못하는 한글도 있어서 CP949로 바로잡았고, 따라 할 수 있는 코드를 추가했다.
목차
개발 환경
- Vue CLI Plugin Electron Builder로 Electron 앱을 개발했다.
- macOS에서 개발하고, 실제 앱은 Windows에서 실행됐다.
문제 상황
macOS에서 개발한 앱이 Windows에서 BAT 파일을 만들면, 그 BAT 파일이 실행되지 않고 한글이 깨졌다.
원인
- 문자 인코딩 차이: Node.js는 문자열을 기본적으로 UTF-8로 저장한다. 그런데 한국어 Windows의 명령 프롬프트(CMD)는 기본 코드 페이지로 CP949를 쓴다. UTF-8로 저장한 BAT 파일을 CMD가 CP949로 읽으면서 한글이 깨지고 명령이 실행되지 않는다.
- 줄바꿈 차이: 소스 코드에 쓴 줄바꿈은
\n(LF)이지만, Windows의 줄바꿈은\r\n(CRLF)이다. BAT 파일은 CRLF로 저장하는 것이 안전하다.
해결 방법
- BAT 파일에 들어가는 텍스트를 CP949로 인코딩해서 저장한다. Node.js 기본 기능에는 CP949 인코딩이 없으니 iconv-lite를 쓴다.
- 줄바꿈은 소스에 직접 쓴
\n이 아니라 Windows 줄바꿈으로 넣는다. Node.js의os.EOL은 앱이 실행되는 OS의 줄바꿈이라, Windows에서 실행되면\r\n이 된다. macOS에서 테스트할 때도 같은 결과를 얻으려면\r\n을 직접 쓴다.
npm install iconv-lite
const fs = require("fs");
const iconv = require("iconv-lite");
const lines = ["@echo off", "echo 안녕하세요", "pause"];
// Windows 줄바꿈(CRLF)으로 잇고, CP949로 인코딩해서 저장한다
const text = lines.join("\r\n");
fs.writeFileSync("run.bat", iconv.encode(text, "cp949"));
저장된 파일은 메모장에서 열어 오른쪽 아래 상태 표시줄로 인코딩을 확인할 수 있다. 명령 프롬프트에서 chcp 를 실행하면 현재 코드 페이지가 나온다(한국어 Windows는 949).
정리
- 한국어 Windows CMD용 BAT 파일은 CP949로 인코딩해서 저장한다.
- 줄바꿈은 Windows 줄바꿈(
\r\n)으로 넣는다.