본문 바로가기
프로그래밍

CP949와 UTF-8의 차이에 대해서 알아보자

by bantomak 2025. 4. 21.
반응형

CP949 vs UTF-8

매번 헷갈리는 CP949UTF-8에 대해서 알아보자. 매번 까먹을 때마다 기억하기 위해서 보고 또 보도록 하자.

항목 CP949 UTF-8
정식 명칭 Code Page 949 (확장 완성형 한글) 8-bit Unicode Transformation Format
문자 범위 한글 중심 (한자/기타 제한적) 전 세계 모든 문자
바이트 수 1~2바이트 1~4바이트
표준 여부 비표준 (MS 전용) 국제 표준(Unicode)
운영체제 호환 Windows에서 주로 사용 거의 모든 OS/플랫폼에서 사용
호환성 Windows 전용 파일이기 때문에 제한적 전 세계 범용, 웹/API에서 필수
BOM 사용 사용하지 않음 선택적으로 사용

비주얼 스튜디오에서 생성한 파일은 기본적으로 CP949 인코딩의 파일이다. 아무래도 CP949는 Windows 전용 인코딩이다 보니 다른 운영체제를 사용하는 사람들과의 협업하기에 적합하지 않다. 그렇기 때문에 이를 국제 표준인 UTF-8로 변환해서 사용하는 것이 일반적이다.

 

'파일' -> '다른 이름으로 '현재 파일명' 저장' 메뉴 클릭

비주얼 스튜디오 고급 저장에서 인코딩을 확인할 수 있다.

CP949 파일로 저장

// CP949로 파일 저장 (StreamWriter)
var encoding = Encoding.GetEncoding("ks_c_5601-1987"); // 또는 "CP949"
File.WriteAllText("hello.txt", "안녕하세요", encoding);

UTF-8 파일로 저장

추가적으로 UTF-8은 선택적으로 BOM(Byte Order Mark)를 가지는데 BOM 없이 저장하는 것이 웹 표준이다.

File.WriteAllText("hello.txt", "안녕하세요", Encoding.UTF8); // UTF-8 with BOM
File.WriteAllText("hello.txt", "안녕하세요", new UTF8Encoding(false)); // UTF-8 without BOM

서명 없는 UTF-8로 저장해서 사용하는 것이 적합하다.

“서명 없는 UTF-8 (UTF-8 without BOM)”을 사용하자

“서명 없는 UTF-8 (UTF-8 without BOM)”이 협업에 가장 안전하고 널리 쓰이는 인코딩이다.

  • 대부분의 시스템은 "BOM 없는 UTF-8"을 기본으로 처리
    • 리눅스 쉘, Docker, Git (BOM이 있으면 스크립트 실행 실패)
    • 웹 브라우저(HTML/JS) BOM 있으면 CSS, JS 깨질 가능성이 있음
    • JSON 파서(Node.js, Python, Java) 
    • Git diff, lint, CI (BOM으로 인한 변경 감지)
  • BOM은 보이지 않지만 "숨은 문제"를 일으킴
    • Git, Shell, JSON 등은 BOM이 있으면 오작동하거나 충돌이 발생할 수 있음

정리하자면

  • CP949는 윈도우 전용 인코딩
  • UTF-8은 국제 표준 인코딩
  • 불특정 다수와 협업할 때는 국제 표준인 UTF-8(서명 없는)을 사용하자.

함께 읽으면 좋은 글

 

C# 컴퓨터가 문자를 표현하는 방법, 문자 인코딩

string에서 byte[]로 변환하기string 타입에서 ToCharArray() 함수를 통해서 바로 Char배열로 변환하는 함수는 존재하지만 ToByteArray() 함수는 존재하지 않는다. 그 이유는 무엇일까? 그 이유는 byte[]로 변환

jettstream.tistory.com

댓글