자막이 깨져요? 한글 자막 인코딩 깨짐 해결 (UTF-8 vs EUC-KR/CP949, 모지바케)
자막 파일을 열었더니 타임스탬프는 멀쩡한데 대사가 안녕, café, ??? 같은 글자로 나옵니다. 대개 파일이 망가진 것이 아니라, 파일 안의 바이트를 잘못된 문자표로 읽고 있는 것입니다.
인코딩이 무엇인가
자막 파일은 디스크에 저장된 바이트입니다. 문자 인코딩은 그 바이트를 글자로 바꾸는 변환표이고, 같은 바이트라도 어떤 표로 읽느냐에 따라 전혀 다른 글자가 됩니다. 한 인코딩으로 저장한 파일을 다른 인코딩으로 읽으면 영어가 아닌 글자가 전부 엉뚱하게 나옵니다.
자주 만나는 인코딩은 두 갈래입니다.
- UTF-8: 거의 모든 언어를 표현할 수 있는 현재의 표준 인코딩입니다. 요즘 플레이어, 편집기, 플랫폼은 대부분 UTF-8을 기대합니다.
- 레거시 코드페이지: UTF-8 이전에 지역별로 쓰던 문자표로, 하나의 언어권만 담습니다.
- 한글: EUC-KR, CP949(UHC 또는 Windows-949라고도 하며 EUC-KR을 확장한 것)
- 일본어: Shift-JIS (CP932)
- 중국어 간체: GB2312, GBK (CP936), GB18030 (GBK를 확장한 것)
- 중국어 번체: Big5 (CP950)
- 서유럽어: Windows-1252, ISO-8859-1 (Latin-1)
- 키릴 문자: Windows-1251
이렇게 인코딩이 어긋나서 글자가 깨지는 현상을 모지바케(mojibake)라고 부릅니다.
깨진 모양으로 원인 판단하기
깨진 모양을 보면 텍스트를 되살릴 수 있는지 알 수 있습니다.
| 보이는 모습 | 의미 | 복구 |
|---|---|---|
읽히지만 엉뚱한 글자: 안녕, café, при |
모지바케: 바이트는 맞고 읽는 쪽이 틀림 | 가능: 올바른 인코딩으로 다시 읽기 |
파일에 박힌 ? 또는 �(대체 문자) |
예전에 저장할 때 손실 변환이 일어나 원래 바이트가 사라짐 | 대개 불가: 원본에서 다시 받기 |
빈 네모(□ □ □) |
인코딩이 아니라 해당 글자가 없는 폰트 문제 | 그 글자가 들어 있는 폰트 설치 |
첫 번째 경우는 완전히 고칠 수 있습니다. 다만 모지바케는 서로 반대 방향으로 일어나고, 깨진 모양을 보면 어느 쪽인지 알 수 있습니다.
UTF-8 파일을 서유럽 코드페이지로 읽은 경우: 라틴 기호가 뒤섞여 보입니다. 파일은 이미 UTF-8인데 플레이어나 편집기가 Windows-1252로 읽고 있습니다.
- UTF-8로 저장한 한글은
안녕처럼 보입니다. 한글 한 글자를 이루는 여러 바이트가 각각 다른 라틴 기호로 그려지기 때문입니다. - UTF-8로 저장한
café는café로 보입니다.é의 두 바이트C3 A9중C3은Ã,A9는©로 읽힙니다.
바이트는 이미 맞으므로, 도구가 파일을 UTF-8로 읽게만 하면 됩니다.
레거시 코드페이지 파일을 UTF-8로 읽은 경우: 한글·일본어·중국어 자막이 깨지는 흔한 원인입니다. 오래된 EUC-KR/CP949, Shift-JIS, Big5 파일을 UTF-8 도구로 열면 �나 깨진 글자가 나옵니다. 이때는 원래 코드페이지를 지정해 다시 연 뒤 UTF-8로 저장합니다.
어느 경우든 타임스탬프는 멀쩡하게 남습니다. 숫자, :, ,, -->, 줄바꿈은 UTF-8과 이 코드페이지들에서 같은 바이트로 표현되기 때문입니다. 타이밍 줄은 깨끗한데 대사만 깨졌다면 파일 손상이 아니라 인코딩 문제로 보면 됩니다.
모지바케 고치기
방법은 늘 같습니다. 파일의 실제 인코딩(위 두 경우에 따라 UTF-8 또는 레거시 코드페이지)을 지정해 다시 열고, 글자가 제대로 읽히는지 확인한 뒤 UTF-8로 저장합니다.
자막 인코딩 변환기 (무료, 브라우저)
자막 인코딩 변환기에 깨진 파일을 올리면 추정한 인코딩으로 미리보기를 보여 줍니다. 글자가 바르게 읽힐 때까지 원본 인코딩(EUC-KR/CP949, Shift-JIS, GB18030/GBK, Big5, Windows-1252, Windows-1251)을 바꿔 보고, UTF-8(BOM 없음)로 내려받으면 됩니다. SRT 외에 VTT, ASS, SMI 같은 자막 파일도 받고, 처리는 브라우저 안에서만 이루어져 파일이 서버로 올라가지 않습니다.
Notepad++ (무료, Windows)
- 파일을 열고 Encoding > Character sets에서 글자가 읽히게 만드는 코드페이지를 고릅니다. 오래된 한글 파일이면 Korean > Windows 949 또는 EUC-KR입니다. 파일이 실제로는 UTF-8인데 라틴 기호로 보인다면 Encoding > UTF-8을 고릅니다. 이 단계는 바이트를 바꾸지 않고 해석만 바꿉니다.
- 글자가 제대로 읽히는지 확인합니다.
- Encoding > Convert to UTF-8을 고릅니다('Convert to UTF-8-BOM'이 아닙니다).
- 저장합니다.
VLC (모든 운영체제)
도구 > 환경 설정 > 자막 / OSD > 기본 인코딩을 파일의 실제 코드페이지(예: 한국어 (EUC-KR/CP949))로 바꿉니다. 이 설정은 VLC에서 재생할 때의 표시만 바꾸고 파일은 그대로 두므로, 다른 앱에서는 여전히 깨져 보입니다.
iconv (명령줄, macOS·Linux)
iconv -f CP949 -t UTF-8 broken.srt > fixed.srt
한글 파일은 EUC-KR보다 CP949로 지정하는 편이 안전합니다. EUC-KR에 없는 글자(예: 똠, 햏)가 섞여 있으면 EUC-KR 지정으로는 변환이 중간에 멈출 수 있습니다. 다른 언어는 SHIFT-JIS, GBK, BIG5, WINDOWS-1252 등으로 바꿔 씁니다.
어떤 도구를 쓰든 BOM 없는 UTF-8로 저장하세요. 파일이 UTF-8이 되면 VTT로 변환하거나 텍스트만 추출하는 등 다른 도구도 정상적으로 동작합니다. 타이밍까지 어긋났다면 자막 싱크 맞추기를 참고하세요.
BOM 주의
UTF-8로 저장할 때 일부 편집기는 파일 맨 앞에 보이지 않는 3바이트(EF BB BF), 곧 BOM(Byte Order Mark)을 붙입니다. UTF-8에는 필요 없는 바이트이고 SRT에서는 문제를 일으킵니다. BOM이 첫 큐 번호 바로 앞에 놓이기 때문에 일부 파서가 1번 큐를 인식하지 못하거나, 첫 자막 앞에 (그 3바이트를 서유럽 문자로 읽은 모양) 같은 글자가 보입니다.
편집기가 둘 다 제공하면 "UTF-8"을 고르고 "UTF-8 with BOM"이나 "UTF-8-BOM"은 피하세요. Notepad++에서는 Encoding > Convert to UTF-8이 BOM 없는 쪽입니다.
텍스트가 실제로 사라진 경우
파일 안에 ?나 �가 화면 표시가 아니라 실제 바이트로 들어 있다면, 예전에 어떤 도구가 그 글자를 표현할 수 없는 인코딩으로 파일을 다시 저장하면서 글자를 자리표시자로 바꾼 것입니다. 이 변환은 되돌릴 수 없어서, 어떤 인코딩으로 다시 읽어도 원래 글자는 돌아오지 않습니다.
이때 할 수 있는 일은 두 가지입니다.
- 원본에서 자막을 다시 받거나 다시 내보내고, 이번에는 UTF-8로 저장합니다.
- 영상에서 자막을 새로 만듭니다.
한글 자막에서 특히 자주 생기는 이유
한글, 일본어, 중국어는 UTF-8 이전부터 널리 쓰인 레거시 코드페이지가 있어서 이 문제가 자주 생깁니다. 오래된 사이트에서 받았거나 DVD에서 추출한 한글 자막은 CP949로 저장된 경우가 많고, UTF-8을 기본으로 하는 편집기나 플레이어에서 열면 깨집니다. CP949(또는 EUC-KR)로 다시 읽어 UTF-8로 저장해 두면 이후에는 다른 기기에서도 그대로 읽힙니다.
자막을 새로 만드는 경우
원본 파일을 구할 수 없다면 영상에서 자막을 다시 만드는 편이 빠를 수 있습니다. Picute에 영상 파일이나 유튜브 링크를 넣으면 60개 언어로 전사할 수 있고, 편집기에서 내보내는 SRT와 VTT는 UTF-8 텍스트라 최신 플레이어와 편집기에서 그대로 읽힙니다.
관련 글
- SRT, VTT, SBV, ASS 자막 파일 차이점 정리: 포맷별 구조와 변환 방법
- 자막 싱크가 안 맞을 때: 자막이 밀리거나 점점 어긋날 때
- 긴 영상 자막 만들기: 긴 영상의 자막 작업
자주 묻는 질문
PC의 VLC에선 자막이 멀쩡한데 폰이나 TV에선 깨져요. 왜죠?
자막 파일에는 보통 인코딩 정보가 들어 있지 않아서, 플레이어마다 기본으로 가정하는 인코딩이 다릅니다. PC의 VLC는 기본 인코딩을 사용자가 정할 수 있어 CP949 파일을 맞게 읽고 있을 수 있지만, TV나 폰 앱은 UTF-8로 가정하고 같은 바이트를 깨진 글자로 보여 줍니다. 기기마다 설정을 바꾸기보다 파일을 한 번 UTF-8로 바꿔 두면 어느 플레이어에서나 같은 글자로 읽힙니다.