블로그로 돌아가기

자막 깨짐 해결: 인코딩을 UTF-8로 바꾸는 법

자막 깨짐 해결은 인코딩 확인부터예요. é, þ, �, ??? 같은 글자는 코드 페이지가 원인이에요. 메모장, 텍스트 편집기, FFmpeg로 UTF-8로 변환하거나 플레이어에서 지정하세요.

2026년 11월 3일
Sablate Team

자막 깨짐은 플레이어가 파일을 잘못된 문자 인코딩으로 읽을 때 생겨요. 안녕하세요가 �븞�뀞�븯�꽭�슂나 �ȳ��ϼ���로 보이거나, 마름모와 물음표가 나타나요. 패턴마다 원인이 정해져 있어요. 해결은 거의 늘 같아요. 파일을 UTF-8로 변환하거나, 파일이 쓰는 옛 코드 페이지를 플레이어에 알려 주면 돼요.

아래에서는 깨진 글자를 읽는 법, 내 파일이 어떤 코드 페이지일 가능성이 높은지, Windows와 Mac에서 쓸 수 있는 세 가지 해결 방법, 빈 사각형이 왜 다른 문제인지, 그리고 재발을 막는 방법을 차례로 다뤄요.

자막이 이상한 글자로 보이는 이유는 무엇인가요?

.srt 파일은 일반 텍스트이고, 일반 텍스트에는 어떤 인코딩으로 저장했는지가 적혀 있지 않아요. 그래서 플레이어가 추측해야 해요. 먼저 모든 문자 체계를 담는 UTF-8을 시도하고, 바이트가 올바른 UTF-8이 아니면 기본값으로 넘어가요. 보통은 플레이어가 실행되는 컴퓨터의 옛 Windows 코드 페이지예요.

문제의 뿌리는 바로 이 옛 코드 페이지예요. UTF-8이 표준이 되기 전에 Windows는 지역마다 코드 페이지를 하나씩 써서 텍스트를 저장했어요. 서유럽은 Windows-1252, 터키어는 1254, 키릴 문자는 1251, 한국어는 949, 일본어는 932예요. 코드 페이지마다 같은 바이트 값이 서로 다른 글자를 가리켜요. 터키어 파일에서 ş를 뜻하는 바이트가 서유럽 코드 페이지에서는 þ를 뜻해요.

Microsoft의 코드 페이지 문서도 이 문제를 분명하게 짚어요. 이런 코드 페이지는 “컴퓨터마다 다를 수 있고, 한 컴퓨터 안에서도 바뀔 수 있어서 데이터 손상으로 이어진다”고 하면서, 대신 UTF-8을 쓰라고 권해요. 몇 해 전 한국이나 터키 PC에서 만든 자막을 오늘 영어 노트북에서 재생하면 딱 이 경우예요.

텍스트 자체는 대개 파일에 그대로 남아 있어요. 읽는 방식만 틀렸을 뿐이라서, 파일의 진짜 코드 페이지만 알면 금방 고칠 수 있어요.

깨진 글자가 알려 주는 것

증상마다 원인이 달라요. 아래 예시는 우리가 직접 인코딩한 파일을 일부러 잘못된 방식으로 열어 얻은 결과예요.

보이는 모습무슨 일이 일어났나해결
�븞�뀞�븯�꽭�슂, Déjà vu, ç, ö (글자 하나가 기호 두세 개로)UTF-8 파일을 옛 코드 페이지로 읽음. 한국어 PC에서는 CP949, 그 밖에는 Windows-1252가 흔해요플레이어를 UTF-8로 설정하거나 파일을 UTF-8 with BOM으로 저장
Þu iþi çýðlýk, Ïðèâåò, Za¿ó³æ (엉뚱한 글자)터키어, 러시아어, 폴란드어 코드 페이지 파일을 서유럽 코드 페이지로 읽음실제 코드 페이지에서 UTF-8로 변환
� 마름모 또는 �ȳ��ϼ���옛 코드 페이지 파일을 UTF-8로 읽음실제 코드 페이지에서 UTF-8로 변환
글자가 있어야 할 자리에 ???누군가 그 글자가 없는 코드 페이지로 텍스트를 저장하면서 글자가 삭제됨원본 파일을 다시 구하세요. 어떤 변환으로도 복원되지 않아요
빈 사각형, 나머지는 정상폰트에 그 문자 체계의 글리프가 없음. 텍스트는 멀쩡해요폰트 변경

앞의 두 행이 흔한 경우이고, 서로 정반대예요. 첫 번째는 파일이 이미 올바르고 플레이어가 틀린 경우예요. 두 번째와 세 번째는 파일이 옛 코드 페이지라서, 그 코드 페이지를 추측해 주지 않는 모든 플레이어에서 깨져요. 한 번 UTF-8로 변환해 두면 모든 플레이어가 한꺼번에 해결돼요.

내 자막 파일은 어떤 코드 페이지일까요?

자막 언어를 보면 알 수 있어요. UTF-8이 아닌 파일은 거의 항상 그 언어에 맞는 옛 Windows 코드 페이지예요.

자막 언어옛 Windows 코드 페이지FFmpeg에서 쓰는 이름
영어, 프랑스어, 독일어, 스페인어, 포르투갈어, 이탈리아어1252CP1252
폴란드어, 체코어, 헝가리어1250CP1250
러시아어, 우크라이나어, 불가리아어1251CP1251
그리스어1253CP1253
터키어1254CP1254
아랍어1256CP1256
일본어932 (Shift-JIS)CP932
한국어949CP949
중국어 간체936 (GB2312)GB18030
중국어 번체950 (Big5)CP950

GB18030은 중국어 간체 코드 페이지의 상위 집합이라서, GBK나 GB2312로 저장한 파일도 읽을 수 있어요.

내 파일이 어떤 상태인지 확인하려면 Windows 메모장(Notepad)에서 파일을 여세요. 상태 표시줄에 인코딩 이름이 나오고, “ANSI”는 옛 코드 페이지라는 뜻이에요. Mac이나 Windows의 Git Bash에서는 이렇게 실행하세요.

file --mime-encoding subtitles.srt

utf-8이나 us-ascii가 나오면 파일은 멀쩡하고 플레이어가 문제예요. iso-8859-1이나 unknown-8bit이 나오면 옛 코드 페이지예요. 이 도구는 그중 어느 것인지까지는 알려 주지 못하니, 표에서 자막 언어를 기준으로 고르세요.

자막 인코딩을 고치는 세 가지 방법

  1. 텍스트 편집기에서 UTF-8로 다시 저장하기. 파일 하나라면 무료이고 빨라요.
  2. FFmpeg로 변환하기. 명령어 한 줄이면 어떤 코드 페이지든 되고, Windows, Mac, Linux에서 모두 돼요.
  3. 플레이어나 인코더에 인코딩 알려 주기. 새 파일은 필요 없지만, 고쳐지는 건 그 프로그램 안에서만이에요.

앞의 두 가지는 어디서나 제대로 재생되는 UTF-8 파일을 만들어 줘요. 세 번째는 컴퓨터 한 대의 프로그램 하나에서만 통하는 임시방편이에요.

방법 1: 메모장이나 텍스트 편집기에서 자막 파일을 UTF-8로 저장하기

Windows에서는 메모장(Notepad)으로 .srt를 여세요. 파일이 올바른 UTF-8이 아니면 메모장은 Windows 시스템 코드 페이지로 읽어요. 파일이 내 시스템과 맞으면 잘 되는데, 터키어 Windows에서는 터키어 파일이 제대로 열려요. 글자가 올바르게 보이면 파일 → 다른 이름으로 저장을 선택하고, 인코딩을 UTF-8로 설정한 다음 새 이름으로 저장하세요. 메모장에서도 글자가 이상하게 보이면 내 시스템 코드 페이지가 파일의 코드 페이지와 다르다는 뜻이니, 방법 2를 쓰세요.

Mac에서는 텍스트 편집기(TextEdit)가 파일을 열 때 인코딩을 고르게 해 줘요. Apple의 제대로 표시되지 않는 문자 안내에 순서가 나와 있어요. 열기 대화상자에서 Show Options(옵션 보기)를 클릭하고, Plain Text Encoding(일반 텍스트 인코딩) 메뉴에서 인코딩을 고르세요. 자막 언어에 맞는 인코딩을 고르고 글자가 올바르게 읽히는지 확인한 다음, UTF-8로 사본을 저장하세요. 저장할 때의 기본값은 TextEdit → Settings → Open and Save(열기 및 저장)의 Plain Text File Encoding에 있어요.

한계가 두 가지 있어요. 한 번에 파일 하나만 다룰 수 있고, 열었을 때 글자가 올바르게 보여야만 쓸 수 있어요. 여전히 깨져 보이는 파일은 절대 저장하지 마세요. 잘못된 글자가 UTF-8에 그대로 영구히 기록돼요.

방법 2: FFmpeg로 자막을 UTF-8로 변환하기

FFmpeg는 -sub_charenc로 지정한 어떤 코드 페이지든 자막 파일을 읽을 수 있어요. FFmpeg 문서는 이 옵션을 “입력 자막의 문자 인코딩을 설정한다”고 설명해요. 출력은 UTF-8로 써요. 내 언어에 맞는 줄을 쓰세요. 아래 명령어는 모두 테스트 파일로 직접 실행해 봤어요.

ffmpeg -sub_charenc CP1252 -i french.srt french-utf8.srt
ffmpeg -sub_charenc CP1250 -i polish.srt polish-utf8.srt
ffmpeg -sub_charenc CP1251 -i russian.srt russian-utf8.srt
ffmpeg -sub_charenc CP1253 -i greek.srt greek-utf8.srt
ffmpeg -sub_charenc CP1254 -i turkish.srt turkish-utf8.srt
ffmpeg -sub_charenc CP1256 -i arabic.srt arabic-utf8.srt
ffmpeg -sub_charenc CP932 -i japanese.srt japanese-utf8.srt
ffmpeg -sub_charenc CP949 -i korean.srt korean-utf8.srt
ffmpeg -sub_charenc GB18030 -i chinese.srt chinese-utf8.srt
ffmpeg -sub_charenc CP950 -i chinese-traditional.srt chinese-traditional-utf8.srt

-sub_charenc는 반드시 -i 앞에 와야 해요. 빼먹으면 FFmpeg가 아래 오류와 함께 멈추는데, 파일이 UTF-8이 아니라는 걸 알아보는 방법이기도 해요.

Invalid UTF-8 in decoded subtitles text; maybe missing -sub_charenc option

출력에 여전히 엉뚱한 글자가 보이면 추측이 틀린 거예요. 표에서 이웃한 코드 페이지를 시도해 보세요. 키릴 문자 파일을 CP1251로 읽었는데 터키어가 나올 수는 없으니, 추측이 틀렸는지는 한눈에 알 수 있어요.

같은 명령어가 Windows, Mac, Linux에서 모두 돌아가고, FFmpeg는 무료예요.

방법 3: VLC, HandBrake, FFmpeg 구워 넣기에서 인코딩 지정하기

새 파일을 만들고 싶지 않다면, 파일을 읽는 프로그램에 인코딩을 알려 주세요.

VLC. VideoLAN 위키의 자막 인코딩 페이지에 경로가 나와 있어요. Tools → Preferences(도구 → 환경설정)를 열고 Subtitles / OSD → Default encoding으로 가세요. 코드 페이지를 고르고 Save를 누른 다음 VLC를 다시 시작하세요. 증상 표의 두 번째와 세 번째 행에 도움이 돼요. 다만 그 컴퓨터의 VLC만 바뀌어서, 같은 파일이 TV, 휴대폰, 미디어 서버에서는 여전히 깨져요.

HandBrake. Subtitles 탭에서 SRT를 가져올 때, HandBrake 문서는 “‘Char Code’ 드롭다운에서 올바른 문자 코드가 선택되어 있는지 확인하라”고 안내하고, 잘못 고르면 “출력 파일에 자막 트랙이 없게 된다”고 경고해요.

FFmpeg 구워 넣기. subtitles 필터에는 자체 charenc 옵션이 있어서, 옛 코드 페이지 파일을 바로 화면에 구워 넣을 수 있어요.

ffmpeg -i video.mp4 -vf "subtitles=turkish.srt:charenc=CP1254" -c:a copy output.mp4

Mac에서 Homebrew의 기본 ffmpeg에는 libass가 없어서 subtitles 필터가 없다고 나와요. ffmpeg-full을 설치하고 $(brew --prefix ffmpeg-full)/bin/ffmpeg 바이너리를 실행하세요. 나머지 구워 넣기 옵션은 자막을 영상에 구워 넣는 가이드에 있어요.

글자 대신 빈 사각형이 보일 때: 인코딩이 아닌 폰트 문제

빈 사각형은 텍스트는 올바르게 읽혔는데 폰트에 그 글자를 그릴 글리프가 없다는 뜻이에요. 파일을 변환해도 달라지는 게 없어요.

어떻게 나타나는지는 렌더러에 따라 달라요. 라틴 문자 전용 폰트인 Impact 스타일을 지정한 한국어 큐를 Windows에서 FFmpeg로 구워 넣어 봤어요. libass는 쉼표와 마침표는 Impact로 그리고, 한글은 설치된 다른 폰트에서 가져왔어요. 빈 사각형은 없었지만, 내가 고르지 않은 뒤섞인 모양이 됐어요. 빈 사각형은 그 문자 체계를 지원하는 폰트가 기기에 하나도 없을 때 나타나는데, 서버나 내장 폰트가 적은 플레이어에서 생겨요.

해결 방법은 해당 언어를 지원하는 폰트를 지정하는 거예요. FFmpeg 구워 넣기에서는 force_style로 해요.

ffmpeg -i video.mp4 -vf "subtitles=korean-utf8.srt:force_style='FontName=Malgun Gothic'" -c:a copy output.mp4

Windows와 Mac에서 어떤 시스템 폰트가 어떤 문자 체계를 지원하는지는 자막 폰트 가이드에 정리해 뒀어요.

Sablate는 자막 인코딩과 폰트를 어떻게 다루나요

Sablate는 .srt, .vtt, .txt, .ass 등 모든 자막 내보내기를 UTF-8로 써요. 전사는 유니코드로 시작하기 때문에 코드 페이지가 파일에 끼어들 일이 없고, 같은 파일이 한국어, 터키어, 아랍어에서 모두 제대로 읽혀요.

폰트는 언어별로 처리해요. 번역 레이어마다 자체 스타일이 있고, 내가 고른 자막 폰트가 그 문자 체계를 그릴 수 없으면 Sablate가 시스템에 들어 있는 폰트로 대체해요. 한국어는 Windows에서 Malgun Gothic, Mac에서 Apple SD Gothic Neo, 일본어는 Yu Gothic UI와 Hiragino Sans, 중국어 간체는 Microsoft YaHei와 PingFang SC예요. 미리보기도 구워 넣을 때와 같은 폰트를 쓰기 때문에, 확인한 모습 그대로 렌더링돼요.

솔직하게 말씀드리면 한계가 하나 있어요. Sablate의 .srt와 .vtt 가져오기는 파일을 UTF-8로 읽고, 옛 코드 페이지는 감지하지 않아요. 오래된 파일은 방법 1이나 방법 2로 변환한 다음 가져오세요. 편집기와 내보내기 기능의 나머지는 기능 소개에 정리돼 있어요.

옛 코드 페이지 읽기결과물플랫폼가격
Notepad시스템 코드 페이지만파일의 UTF-8 사본Windows무료
TextEdit예, 열 때 선택파일의 UTF-8 사본Mac무료
FFmpeg예, 모든 코드 페이지. -sub_charenc 또는 charenc 사용UTF-8 사본 또는 자막을 구워 넣은 영상Windows, Mac, Linux무료
VLC예, Default encoding 사용그 컴퓨터에서의 올바른 재생Windows, Mac, Linux무료
HandBrake예, SRT를 가져올 때 Char Code 사용자막이 들어간 영상Windows, Mac, Linux무료
Sablate아니요, UTF-8만 가져옴UTF-8 내보내기와 언어별 구워 넣기 폰트Windows, Mac무료 플랜. Pro는 $29 한 번 결제 또는 월 $5.99

이미 있는 파일을 고치는 데는 무료 도구가 더 나아요. FFmpeg와 TextEdit는 어떤 옛 코드 페이지든 읽고, Sablate는 읽지 못해요. Sablate는 자막을 새로 만들 때, 특히 여러 언어로 만들면서 이런 수리가 필요 없는 파일을 원할 때 어울려요.

어떤 해결 방법을 쓸까요?

“내 컴퓨터의 VLC에서 파일 하나만 이상하게 보여요.” VLC의 Default encoding을 바꾸거나, 파일을 한 번 변환해 두고 잊어버리세요.

“자막이 TV, 휴대폰, Plex, YouTube에서 재생돼야 해요.” 방법 1이나 2로 UTF-8로 변환하세요. 다른 기기는 내 VLC 설정을 공유하지 않아요. YouTube의 자막 파일 도움말에서도 SRT는 “반드시 일반 UTF-8이어야 한다”고 해요.

“é와 ö가 보여요.” 파일은 이미 UTF-8이에요. 플레이어를 고치거나, 메모장에서 UTF-8 with BOM으로 사본을 저장해서 파일이 자기 인코딩을 스스로 알리게 하세요.

“자막을 영상에 구워 넣는 중이에요.” FFmpeg 명령어에 charenc를 쓰거나 먼저 변환한 다음, 그 언어에 맞는 폰트를 확인하세요.

“물음표가 보여요.” 변환은 그만두고 원본 파일을 찾으세요. 이 파일에는 글자가 더 이상 남아 있지 않아요.

자막이 다시 깨지지 않게 하려면

모든 자막 파일을 UTF-8로 저장하세요. 메모장에서는 다른 이름으로 저장의 인코딩 선택이 그 설정이고, ANSI는 피하세요. Mac에서는 텍스트 편집기의 저장 인코딩을 한 번만 UTF-8로 설정해 두세요.

편집하기 전에 먼저 변환하세요. 깨진 파일을 편집한 다음 변환하면 인코딩 두 가지가 한 파일에 섞여서, 나중에 고치기가 훨씬 어려워져요.

변환한 사본이 실제로 재생될 곳, 즉 TV, 미디어 서버, 사이트에서 제대로 읽힐 때까지 원본을 보관하세요. 오래된 기기가 UTF-8을 여전히 잘못 읽는다면 UTF-8 with BOM으로 저장한 사본이 대개 해결해 줘요. BOM이 추측에 의존하던 프로그램에 이 파일이 UTF-8이라고 알려 주기 때문이에요.

자막을 처음부터 만들 때는 인코딩도 제대로 만드는 과정의 일부예요. SRT 파일 만드는 법에서 Windows와 Mac의 저장 대화상자에 숨은 함정을 다뤘어요.

오래된 자막을 고치는 게 아니라 자막을 새로 생성한다면, UTF-8로 쓰고 언어별 폰트까지 골라 주는 도구에서 시작하세요. Windows용·Mac용 Sablate를 다운로드하고, 100개 전사 언어 중 어느 것으로든 첫 파일을 내보내 보세요.

자주 묻는 질문

자막이 이상한 글자로 보이는 이유는 무엇인가요?

플레이어가 파일을 잘못된 문자 인코딩으로 읽었기 때문이에요. 자막 파일에는 어떤 인코딩을 쓰는지 기록되어 있지 않아서 플레이어가 추측하는데, 추측이 틀리면 악센트가 있는 글자나 라틴 문자가 아닌 글자가 기호로 바뀌어요. 파일을 UTF-8로 변환하거나 파일이 저장된 코드 페이지를 플레이어에 알려 주면 글자가 돌아와요.

자막 파일을 UTF-8로 변환하려면 어떻게 하나요?

파일을 제대로 읽어 주는 텍스트 편집기로 열어서 UTF-8로 사본을 저장하거나, 파일의 옛 코드 페이지를 지정해 FFmpeg를 실행하세요. 예를 들어 터키어 파일은 ffmpeg -sub_charenc CP1254 -i input.srt output.srt 처럼 쓰면 돼요. FFmpeg는 새 파일을 UTF-8로 써요. 원본을 지우기 전에 플레이어에서 결과를 확인하세요.

VLC에서 자막 인코딩을 바꾸려면 어떻게 하나요?

Tools, Preferences, Subtitles / OSD 순서로 열고 Default encoding 목록에서 파일의 코드 페이지를 고르세요. Save를 누르고 VLC를 다시 시작하면 적용돼요. 이 설정은 그 컴퓨터의 VLC 재생만 고치기 때문에, TV, 휴대폰, 웹사이트에서도 재생해야 한다면 파일을 UTF-8로 변환하세요.

자막에 글자 대신 물음표가 보이는 이유는 무엇인가요?

글자를 담을 자리가 없는 인코딩으로 텍스트를 저장하면서 글자가 사라졌기 때문이에요. 예를 들어 한국어나 러시아어 자막을 서유럽 텍스트로 저장하면, 담을 수 없는 글자마다 물음표가 저장돼요. 어떤 변환으로도 되돌릴 수 없으니 원본 파일을 구하거나 원본에서 새로 내보내야 해요.

FFmpeg의 Invalid UTF-8 in decoded subtitles text는 무슨 뜻인가요?

FFmpeg가 UTF-8 자막 파일을 기대했는데 옛 코드 페이지의 바이트를 발견했다는 뜻이에요. 오류 메시지가 해결책을 알려 줘요. -i 앞에 파일의 인코딩을 지정한 -sub_charenc를 붙이세요. 러시아어는 CP1251, 한국어는 CP949 같은 식이에요. 파일을 영상에 구워 넣을 때는 subtitles 필터의 charenc 옵션을 쓰세요.

자막 파일은 어떤 인코딩을 써야 하나요?

UTF-8이에요. 모든 문자 체계를 하나의 인코딩에 담을 수 있어서, 같은 파일이 어떤 기기에서든 어떤 언어로든 제대로 읽혀요. YouTube는 SRT 파일을 일반 UTF-8로 요구하고, 플레이어, TV, 미디어 서버도 옛 Windows 코드 페이지보다 훨씬 안정적으로 읽어요. 오래된 기기가 UTF-8 파일을 여전히 잘못 읽으면 UTF-8 with BOM으로 저장해 보세요.