Wróć do bloga

Kodowanie napisów: jak naprawić polskie znaki

Napisy z krzakami typu é, þ, � albo ??? mają problem z kodowaniem. Znajdź stronę kodową pliku i zamień ją na UTF-8 w Notatniku, TextEdit lub w FFmpeg.

3 listopada 2026
Sablate Team

Napisy pokazują dziwne znaki, gdy odtwarzacz odczytuje plik w złym kodowaniu znaków. Zażółć zamiast Zażółć, Za¿ó³æ zamiast Zażółć, romby, znaki zapytania: każdy wzór wskazuje inną przyczynę. Naprawa prawie zawsze wygląda tak samo: zamień plik na UTF-8 albo powiedz odtwarzaczowi, jakiej starej strony kodowej używa plik.

Poniżej: jak czytać krzaki, w jakiej stronie kodowej jest prawdopodobnie Twój plik, trzy sposoby naprawy w Windows i na Macu, dlaczego prostokąty to inny problem i jak nie dopuścić, żeby wróciły.

Dlaczego napisy pokazują dziwne znaki?

Plik .srt to zwykły tekst, a zwykły tekst nie mówi, w jakim kodowaniu go zapisano. Odtwarzacz musi zgadywać. Próbuje UTF-8, kodowania, które mieści wszystkie pisma, a gdy bajty nie są poprawnym UTF-8, wraca do ustawienia domyślnego, zwykle starej strony kodowej Windows komputera, na którym działa.

Te stare strony kodowe są sednem problemu. Zanim UTF-8 stał się normą, Windows zapisywał tekst w jednej stronie kodowej na region: Windows-1252 dla Europy Zachodniej, 1254 dla tureckiego, 1251 dla cyrylicy, 949 dla koreańskiego, 932 dla japońskiego. Każda z nich używa tych samych wartości bajtów dla innych liter. Bajt, który w tureckim pliku oznacza ş, w zachodnim oznacza þ.

Opis stron kodowych Microsoftu mówi o tym wprost: te strony kodowe „mogą się różnić na różnych komputerach albo zmieniać na jednym komputerze, prowadząc do uszkodzenia danych”, i zaleca zamiast nich UTF-8. Napisy zrobione przed laty na tureckim lub koreańskim komputerze i odtwarzane dziś na angielskim laptopie to dokładnie ten przypadek.

Sam tekst zwykle nadal jest w pliku. Zły jest tylko sposób odczytu, dlatego naprawa jest szybka, gdy znasz prawdziwą stronę kodową pliku.

Co mówią krzaki w napisach

Każdy objaw ma swoją przyczynę. Te przykłady pochodzą z prawdziwych plików, które zakodowaliśmy i otworzyliśmy w niewłaściwy sposób:

Co widziszCo się stałoNaprawa
Déjà vu, ç, ö (dwa symbole zamiast jednej litery)Plik UTF-8 odczytano jako Windows-1252Ustaw w odtwarzaczu UTF-8 albo zapisz plik jako UTF-8 with BOM
Þu iþi çýðlýk, Ïðèâåò, Za¿ó³æ (błędne litery)Plik w tureckiej, rosyjskiej albo polskiej stronie kodowej odczytano jako zachodnioeuropejskiSkonwertuj z prawdziwej strony kodowej na UTF-8
Romby � albo �ȳ��ϼ���Plik w starej stronie kodowej odczytano jako UTF-8Skonwertuj z prawdziwej strony kodowej na UTF-8
??? w miejscu literLitery usunięto, gdy ktoś zapisał tekst w stronie kodowej, która ich nie maZdobądź oryginalny plik jeszcze raz; żadna konwersja ich nie przywróci
Puste prostokąty, reszta poprawnaCzcionka nie ma glifów dla tego pisma; tekst jest w porządkuZmień czcionkę

Pierwsze dwa wiersze to przypadki najczęstsze i są swoim przeciwieństwem. W pierwszym plik jest już poprawny, a zawodzi odtwarzacz. W drugim i trzecim plik jest w starej stronie kodowej, więc psuje się w każdym odtwarzaczu, który tej strony nie zgadnie. Jednorazowa konwersja na UTF-8 naprawia wszystkie odtwarzacze naraz.

W jakiej stronie kodowej jest Twój plik napisów?

Podpowiada to język napisów. Plik, który nie jest w UTF-8, jest prawie zawsze w starej stronie kodowej Windows dla swojego języka:

Język napisówStara strona kodowa WindowsNazwa dla FFmpeg
Angielski, francuski, niemiecki, hiszpański, portugalski, włoski1252CP1252
Polski, czeski, węgierski1250CP1250
Rosyjski, ukraiński, bułgarski1251CP1251
Grecki1253CP1253
Turecki1254CP1254
Arabski1256CP1256
Japoński932 (Shift-JIS)CP932
Koreański949CP949
Chiński uproszczony936 (GB2312)GB18030
Chiński tradycyjny950 (Big5)CP950

GB18030 jest nadzbiorem strony kodowej chińskiego uproszczonego, więc czyta też pliki zapisane jako GBK albo GB2312.

Żeby sprawdzić, co masz, otwórz plik w Notatniku Windows: pasek stanu podaje kodowanie, a „ANSI” oznacza starą stronę kodową. Na Macu albo w Git Bash w Windows uruchom:

file --mime-encoding subtitles.srt

utf-8 albo us-ascii oznacza, że plik jest w porządku, a zawinił odtwarzacz. iso-8859-1 albo unknown-8bit oznacza starą stronę kodową. Narzędzie nie rozpozna której, więc kieruj się językiem z tabeli.

Trzy sposoby na naprawę kodowania napisów

  1. Zapisz plik ponownie jako UTF-8 w edytorze tekstu. Za darmo i szybko dla jednego pliku.
  2. Skonwertuj go w FFmpeg. Jedna komenda, dowolna strona kodowa, Windows, Mac i Linux.
  3. Podaj kodowanie odtwarzaczowi albo koderowi. Bez nowego pliku, ale poprawka działa tylko w tym jednym programie.

Pierwsze dwa dają plik UTF-8, który poprawnie odtwarza się wszędzie. Trzeci to obejście dla jednego programu na jednym komputerze.

Metoda 1: zapisz plik napisów jako UTF-8 w Notatniku albo TextEdit

W Windows otwórz .srt w Notatniku. Gdy plik nie jest poprawnym UTF-8, Notatnik odczytuje go w systemowej stronie kodowej Windows. To działa, jeśli plik pasuje do Twojego systemu: turecki plik na tureckim Windows otworzy się poprawnie. Jeśli tekst wygląda dobrze, wybierz Plik → Zapisz jako, ustaw Kodowanie na UTF-8 i zapisz pod nową nazwą. Jeśli w Notatniku tekst też wygląda źle, systemowa strona kodowa nie jest stroną pliku, więc użyj Metody 2.

Na Macu TextEdit pozwala wybrać kodowanie przy otwieraniu pliku. Poradnik Apple o znakach, które nie wyświetlają się poprawnie podaje kroki: w oknie Open kliknij Show Options (Pokaż opcje), a potem wybierz kodowanie z menu Plain Text Encoding (Kodowanie zwykłego tekstu). Wybierz to, które pasuje do języka napisów, sprawdź, czy tekst czyta się poprawnie, i zapisz kopię jako UTF-8. Domyślne kodowanie zapisu ustawisz w TextEdit → Settings → Open and Save (Ustawienia → Otwieranie i zapisywanie), w sekcji Plain Text File Encoding.

Dwa ograniczenia: działa to na jednym pliku naraz i tylko wtedy, gdy tekst wygląda dobrze po otwarciu. Nigdy nie zapisuj pliku, który nadal wygląda na zepsuty: zapisałbyś błędne litery w UTF-8 na stałe.

Metoda 2: skonwertuj napisy na UTF-8 w FFmpeg

FFmpeg czyta plik napisów w dowolnej stronie kodowej, którą podasz w -sub_charenc, co dokumentacja FFmpeg opisuje jako „Set the input subtitles character encoding” (ustaw kodowanie znaków wejściowych napisów), i zapisuje wynik jako UTF-8. Użyj linii dla swojego języka. Każdą z nich uruchomiliśmy na plikach testowych:

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 musi stać przed -i. Pomiń je, a FFmpeg zatrzyma się z takim błędem, po którym też poznasz, że plik nie jest w UTF-8:

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

Jeśli wynik nadal pokazuje błędne litery, strzał był nietrafiony. Spróbuj sąsiedniej strony kodowej z tabeli. Plik cyrylicki odczytany jako CP1251 nigdy nie wyjdzie jako turecki, więc zły strzał widać od razu.

Ta sama komenda działa w Windows, na Macu i w Linuksie, a FFmpeg jest darmowy.

Metoda 3: ustaw kodowanie w VLC, HandBrake albo przy wypalaniu w FFmpeg

Gdy wolisz nie robić nowego pliku, powiedz kodowanie programowi, który go czyta.

VLC. Strona wiki VideoLAN o kodowaniu napisów podaje ścieżkę: Tools → Preferences, potem Subtitles / OSD → Default encoding. Wybierz stronę kodową, kliknij Save i zrestartuj VLC. Pomaga to przy drugim i trzecim wierszu tabeli objawów. Zmienia VLC tylko na tym komputerze: ten sam plik nadal będzie się psuł w telewizorze, telefonie albo na serwerze multimediów.

HandBrake. Przy imporcie SRT na karcie Subtitles dokumentacja HandBrake każe „make sure the correct character code is selected from the 'Char Code' dropdown” (upewnić się, że z listy Char Code wybrano właściwe kodowanie znaków) i ostrzega, że złe „will result in your output file having no subtitle track” (sprawi, że plik wyjściowy nie będzie miał ścieżki napisów).

Wypalanie w FFmpeg. Filtr subtitles ma własną opcję charenc, więc plik w starej stronie kodowej możesz wypalić prosto w obrazie:

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

Na Macu domyślny ffmpeg z Homebrew nie ma libass i zgłasza, że filtr subtitles nie istnieje; zainstaluj ffmpeg-full i uruchamiaj jego plik z $(brew --prefix ffmpeg-full)/bin/ffmpeg. Pozostałe opcje wypalania znajdziesz w naszym poradniku o wypalaniu napisów w wideo.

Napisy pokazują prostokąty zamiast liter: to problem z czcionką, nie z kodowaniem

Prostokąty oznaczają, że tekst odczytano poprawnie, a czcionka nie ma glifu, żeby go narysować. Konwersja pliku nic tu nie zmienia.

Jak to wygląda, zależy od renderera. Wypaliliśmy w FFmpeg w Windows koreańską linijkę ze stylem Impact, czcionki wyłącznie łacińskiej: libass narysował przecinek i kropkę w Impact, a hangul wziął z innej zainstalowanej czcionki. Bez prostokątów, ale z mieszanym wyglądem, którego nie wybrałeś. Prostokąty pojawiają się, gdy żadna czcionka w systemie nie pokrywa danego pisma, co zdarza się na serwerach i w odtwarzaczach z małym wbudowanym zestawem czcionek.

Rozwiązanie to wskazanie czcionki, która pokrywa dany język. W wypalaniu FFmpeg robi to force_style:

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

Która czcionka systemowa pokrywa które pismo w Windows i na Macu, wypisuje nasz poradnik o czcionkach do napisów.

Jak Sablate radzi sobie z kodowaniem napisów i czcionkami

Sablate zapisuje każdy eksport napisów, .srt, .vtt, .txt i .ass, jako UTF-8. Transkrypcja zaczyna się w Unicode, więc żadna strona kodowa nigdy nie trafia do pliku, a ten sam eksport czyta się poprawnie po koreańsku, turecku czy arabsku.

Czcionkami zajmuje się osobno dla każdego języka. Każda warstwa tłumaczenia ma własny styl, a gdy wybrana czcionka napisów nie narysuje danego pisma, Sablate podstawia czcionkę dostarczaną z systemem: Malgun Gothic w Windows i Apple SD Gothic Neo na Macu dla koreańskiego, Yu Gothic UI i Hiragino Sans dla japońskiego, Microsoft YaHei i PingFang SC dla chińskiego uproszczonego. Podgląd używa tej samej czcionki co wypalanie, więc sprawdzasz dokładnie to, co zostanie wyrenderowane.

Jedno uczciwe ograniczenie: import .srt i .vtt w Sablate czyta pliki jako UTF-8 i nie wykrywa starych stron kodowych. Stary plik skonwertuj Metodą 1 albo Metodą 2, zanim go zaimportujesz. Przegląd funkcji wymienia resztę edytora i eksportów.

Czyta stare strony kodoweCo dostajeszPlatformyCena
NotepadTylko systemową stronę kodowąKopię pliku w UTF-8WindowsZa darmo
TextEditTak, wybierane przy otwieraniuKopię pliku w UTF-8MacZa darmo
FFmpegTak, dowolne, z -sub_charenc albo charencKopię w UTF-8 albo wideo z wypalonymi napisamiWindows, Mac i LinuxZa darmo
VLCTak, przez Default encodingPoprawne odtwarzanie na tym komputerzeWindows, Mac i LinuxZa darmo
HandBrakeTak, przez Char Code przy imporcie SRTWideo z napisami w obrazieWindows, Mac i LinuxZa darmo
SablateNie, importuje tylko UTF-8Eksporty w UTF-8 i czcionka do wypalania dla każdego językaWindows i MacPlan Free; Pro $29 jednorazowo albo $5.99 miesięcznie

Do naprawy istniejącego pliku wygrywają darmowe narzędzia: FFmpeg i TextEdit czytają każdą starą stronę kodową, a Sablate nie. Sablate sprawdza się, gdy dopiero robisz napisy, zwłaszcza w kilku językach, i chcesz plików, które nigdy nie będą wymagały takiej naprawy.

Którego sposobu użyć?

„Jeden plik źle wygląda w VLC na moim komputerze”. Zmień Default encoding w VLC albo skonwertuj plik raz i zapomnij o sprawie.

„Napisy mają działać w telewizorze, telefonie, Plexie albo na YouTube”. Skonwertuj na UTF-8 Metodą 1 albo 2. Inne urządzenia nie przejmą Twoich ustawień VLC, a strona YouTube o plikach napisów mówi, że plik SRT „must be in plain UTF-8” (musi być w zwykłym UTF-8).

„Widzę é i ö”. Plik jest już w UTF-8. Napraw odtwarzacz albo zapisz kopię jako UTF-8 with BOM w Notatniku, żeby plik sam ogłaszał swoje kodowanie.

„Wypalam napisy w wideo”. Użyj charenc w komendzie FFmpeg albo skonwertuj plik wcześniej, a potem sprawdź czcionkę dla danego języka.

„Widzę znaki zapytania”. Przestań konwertować i znajdź oryginalny plik. W tym litery już nie ma.

Jak nie dopuścić, żeby napisy znów się zepsuły

Zapisuj każdy plik napisów jako UTF-8. W Notatniku to wybór Kodowanie w oknie Zapisz jako; unikaj ANSI. Na Macu ustaw raz kodowanie zapisu w TextEdit na UTF-8.

Konwertuj przed edycją. Edycja zepsutego pliku, a dopiero potem konwersja, miesza dwa kodowania w jednym pliku, a taki wynik naprawia się dużo trudniej.

Zachowaj oryginał, dopóki skonwertowana kopia nie będzie poprawnie wyglądała tam, gdzie naprawdę będzie odtwarzana: w telewizorze, na serwerze multimediów, na stronie. Jeśli starsze urządzenie nadal źle czyta UTF-8, zwykle załatwia sprawę kopia zapisana jako UTF-8 with BOM, bo BOM oznacza plik jako UTF-8 dla programów, które inaczej by zgadywały.

Gdy robisz napisy od zera, kodowanie jest częścią zrobienia ich dobrze. Jak zrobić plik SRT opisuje pułapki okna zapisu w Windows i na Macu.

Jeśli napisy generujesz, a nie naprawiasz starych, zacznij w narzędziu, które zapisuje UTF-8 i samo dobiera czcionkę dla każdego języka. Pobierz Sablate na Windows albo Mac i wyeksportuj pierwszy plik w dowolnym z 100 języków transkrypcji.

Najczęściej zadawane pytania

Dlaczego w moich napisach są dziwne znaki?

Bo odtwarzacz odczytał plik w złym kodowaniu znaków. Plik napisów nie zapisuje, jakiego kodowania używa, więc odtwarzacz zgaduje, a błędny strzał zamienia litery z akcentami i znaki spoza alfabetu łacińskiego w symbole. Zamień plik na UTF-8 albo powiedz odtwarzaczowi, w jakiej stronie kodowej plik zapisano, a litery wrócą.

Jak zamienić plik napisów na UTF-8?

Otwórz go w edytorze tekstu, który czyta go poprawnie, i zapisz kopię jako UTF-8, albo uruchom FFmpeg ze starą stroną kodową pliku, na przykład ffmpeg -sub_charenc CP1254 -i input.srt output.srt dla tureckiego pliku. FFmpeg zapisuje nowy plik jako UTF-8. Zanim usuniesz oryginał, sprawdź wynik w odtwarzaczu.

Jak zmienić kodowanie napisów w VLC?

Otwórz Tools, potem Preferences, potem Subtitles / OSD i wybierz stronę kodową pliku na liście Default encoding. Kliknij Save i zrestartuj VLC, żeby zmiana zadziałała. To ustawienie naprawia odtwarzanie tylko w VLC na tym komputerze, więc zamień plik na UTF-8, jeśli ma też działać w telewizorze, telefonie albo na stronie.

Dlaczego zamiast liter napisy pokazują znaki zapytania?

Bo litery przepadły, gdy tekst zapisano w kodowaniu, które nie ma dla nich miejsca. Koreańskie lub rosyjskie napisy zapisane jako tekst zachodnioeuropejski zapamiętują na przykład znak zapytania w miejscu każdej litery, której nie pomieszczą. Żadna konwersja ich nie przywróci, więc potrzebny jest oryginalny plik albo świeży eksport ze źródła.

Co znaczy Invalid UTF-8 in decoded subtitles text w FFmpeg?

Oznacza, że FFmpeg spodziewał się pliku napisów w UTF-8, a znalazł bajty ze starszej strony kodowej. Rozwiązanie podpowiada sam komunikat FFmpeg: dodaj przed -i opcję -sub_charenc z kodowaniem pliku, na przykład CP1251 dla rosyjskiego lub CP949 dla koreańskiego, albo użyj opcji charenc filtra subtitles przy wypalaniu napisów.

Jakiego kodowania powinny używać pliki napisów?

UTF-8. Mieści wszystkie pisma w jednym kodowaniu, więc ten sam plik czyta się poprawnie w każdym języku na każdym urządzeniu. YouTube wymaga plików SRT w zwykłym UTF-8, a odtwarzacze, telewizory i serwery multimediów czytają go znacznie pewniej niż starą stronę kodową Windows. Jeśli starsze urządzenie nadal źle czyta UTF-8, spróbuj zapisać plik jako UTF-8 with BOM.