BOM(Byte Order Mark) 제거 방법과 텍스트 파일 인코딩
UTF-8 BOM이 발생시키는 문제와 원인, 편집기·명령줄로 BOM을 제거하거나 추가하는 방법을 설명합니다.
Q.UTF-8 BOM이란 무엇이고 어떻게 제거하나요?
BOM(Byte Order Mark)은 파일 앞에 붙는 3바이트(EF BB BF) 시그니처로, UTF-8 파일임을 표시합니다. CSV 첫 열 이름 오류, PHP 헤더 오류, JSON 파싱 실패의 원인이 됩니다. VS Code에서는 '다른 이름으로 저장 → UTF-8'(BOM 없음)으로 제거합니다.
CSV 파일을 열었더니 첫 번째 열 이름이 "이름" 처럼 이상한 문자로 시작한다면 UTF-8 BOM이 원인이다. BOM은 파일 맨 앞에 자동으로 붙는 3바이트(0xEF 0xBB 0xBF) 마커로, 사용자 눈에는 보이지 않지만 프로그램이 읽을 때 문제를 일으킨다.
BOM의 역할과 문제
BOM은 원래 UTF-16·UTF-32에서 바이트 순서(Big-endian/Little-endian)를 구분하기 위해 만들어졌다. UTF-8은 바이트 순서가 고정되어 있어 BOM이 불필요하다. 그럼에도 Windows 메모장과 일부 Microsoft 도구는 UTF-8 파일에 BOM을 자동으로 추가한다.
| BOM으로 발생하는 문제 | 상황 |
|---|---|
| CSV 첫 열 이름 앞에 문자 추가 | Excel·Python pandas 읽기 |
PHP headers already sent 오류 | PHP 파일 첫 줄에 BOM |
| JSON 파싱 실패 | json.loads() BOM 미지원 |
| HTML 렌더링 오류 | 앞에 BOM |
| Git diff 오염 | 변경 없이 BOM 추가됨으로 표시 |
BOM 확인 방법
16진수 에디터: 파일 시작이 EF BB BF이면 UTF-8 BOM.
Linux/Mac 터미널:
bash
file -i myfile.csv
# 출력: text/plain; charset=utf-8 (BOM 없음)
# 또는: text/plain; charset=utf-8-bom (BOM 있음)
PowerShell:
powershell
$bytes = [System.IO.File]::ReadAllBytes("myfile.csv")
$bytes[0..2] | ForEach-Object { "{0:X2}" -f $_ }
# EF BB BF → BOM 있음
BOM 제거 방법
VS Code
우측 하단 인코딩 클릭 → UTF-8(BOM 없음) 선택 → 저장. UTF-8 with BOM과 UTF-8을 구분해야 한다.
Notepad++
인코딩 메뉴 → UTF-8 (BOM 없이 인코딩 선택 → 저장.
PowerShell (일괄 처리)
powershell
$files = Get-ChildItem -Recurse -Filter "*.csv"
foreach ($f in $files) {
$content = Get-Content $f.FullName -Encoding UTF8
[System.IO.File]::WriteAllLines($f.FullName, $content)
}
Python
python
with open("input.csv", encoding="utf-8-sig") as f:
content = f.read() # BOM 자동 제거
with open("output.csv", "w", encoding="utf-8") as f:
f.write(content)
BOM이 필요한 경우
Windows 환경에서 Excel로 CSV를 열 때 한글이 깨지는 경우, BOM이 오히려 필요하다. Excel은 BOM이 있어야 UTF-8 파일을 올바르게 인식한다. 이 경우 encoding="utf-8-sig" 로 저장하면 BOM이 포함된다.
---
이 글은 AI가 공개 자료를 기반으로 작성했습니다. 파일 인코딩 변환 전 원본 백업을 권장합니다.