字幕の文字化けを直す方法:UTF-8への変換手順
字幕が文字化けして、意味不明な記号やひし形、疑問符が並ぶのは、文字コードの不一致が原因です。コードページを特定し、メモ帳、テキストエディット、FFmpegでUTF-8に変換する方法やプレイヤー側の設定まで解説します。
字幕が文字化けするのは、プレイヤーがファイルを間違った文字コードで読み込んでいるからです。蟄怜ケ� や ���� が 字幕 の代わりに表示される、ひし形や疑問符が並ぶ、といった具合に、パターンごとに原因が決まっています。直し方はほとんどの場合同じです。ファイルをUTF-8に変換するか、ファイルが使っている古いコードページをプレイヤーに伝えます。
この記事では、文字化けの読み取り方、ファイルがおそらく使っているコードページ、WindowsとMacでの3つの直し方、四角が出る場合は別の問題である理由、そして再発を防ぐ方法を順に説明します。
字幕が文字化けするのはなぜですか?
.srtファイルはプレーンテキストで、プレーンテキストには、どの文字コードで保存されたかが書かれていません。そのためプレイヤーは推測するしかありません。まず、あらゆる文字体系を扱えるUTF-8として読み込みます。バイト列がUTF-8として正しくなければ、既定の文字コードに切り替えます。これはたいてい、そのパソコンの古いWindowsのコードページです。
問題の根っこは、こうした古いコードページにあります。UTF-8が当たり前になる前のWindowsは、地域ごとに1つのコードページでテキストを保存していました。西ヨーロッパはWindows-1252、トルコ語は1254、キリル文字は1251、韓国語は949、日本語は932です。どれも同じバイト値に別々の文字を割り当てています。トルコ語のファイルでşを表すバイトは、西ヨーロッパ言語のファイルではþを表します。
Microsoftのコードページ識別子の一覧は、この問題をはっきり述べています。こうしたコードページは「コンピューターごとに異なる場合があり、1台のコンピューターでも変更される可能性があるため、データの破損につながる」としたうえで、代わりにUTF-8を使うよう勧めています。何年も前にトルコや韓国のパソコンで作った字幕を、今、英語環境のノートパソコンで再生すると、まさにこのケースになります。
テキストそのものは、ファイルの中にたいてい残っています。間違っているのは読み方だけなので、ファイルの本当のコードページさえ分かれば、直すのは簡単です。
文字化けのパターンから原因を読み取る
症状ごとに原因が違います。以下のサンプルは、実際にファイルをエンコードして、わざと間違った方法で開いたものです。
| 見えるもの | 何が起きたか | 対処 |
|---|---|---|
蟄怜ケ�、譁�蟄怜喧縺�(1文字が複数の記号に化ける) | UTF-8のファイルが、古いコードページ(CP932)で読み込まれた。日本語のPCでよくあるケース | プレイヤーをUTF-8に設定するか、BOM付きUTF-8で保存し直す |
Þu iþi çýðlýk、Ïðèâåò、Za¿ó³æ(違う文字になる) | トルコ語、ロシア語、ポーランド語のコードページのファイルが、西ヨーロッパ言語として読み込まれた | 本当のコードページからUTF-8に変換する |
� のひし形、または �ȳ��ϼ��� | 古いコードページのファイルが、UTF-8として読み込まれた | 本当のコードページからUTF-8に変換する |
文字があるはずの場所に ??? | その文字を含まないコードページでテキストを保存した際に、文字が削除された | 元のファイルを入手し直す。変換しても元には戻らない |
| 四角だけが並び、ほかは正しい | フォントにその文字体系のグリフがない。テキストは問題ない | フォントを変更する |
よくあるのは最初の2行で、この2つは正反対です。最初の行では、ファイルはすでに正しく、間違っているのはプレイヤーです。2行目と3行目では、ファイルが古いコードページで保存されているので、そのコードページを推測しないプレイヤーではどれでも文字化けします。一度UTF-8に変換すれば、すべてのプレイヤーが同時に直ります。
字幕ファイルはどのコードページですか?
答えは字幕の言語で決まります。UTF-8でないファイルは、ほとんどの場合、その言語向けの古いWindowsのコードページです。
| 字幕の言語 | 古いWindowsのコードページ | FFmpegでの名前 |
|---|---|---|
| 英語、フランス語、ドイツ語、スペイン語、ポルトガル語、イタリア語 | 1252 | CP1252 |
| ポーランド語、チェコ語、ハンガリー語 | 1250 | CP1250 |
| ロシア語、ウクライナ語、ブルガリア語 | 1251 | CP1251 |
| ギリシャ語 | 1253 | CP1253 |
| トルコ語 | 1254 | CP1254 |
| アラビア語 | 1256 | CP1256 |
| 日本語 | 932 (Shift-JIS) | CP932 |
| 韓国語 | 949 | CP949 |
| 中国語(簡体字) | 936 (GB2312) | GB18030 |
| 中国語(繁体字) | 950 (Big5) | CP950 |
GB18030は簡体字中国語のコードページの上位互換にあたるので、GBKやGB2312で保存されたファイルも読み込めます。
手元のファイルがどれかを確認するには、Windowsのメモ帳で開きます。ステータスバーに文字コードが表示され、「ANSI」と出たら古いコードページです。MacやWindowsのGit Bashでは、次のコマンドを実行します。
file --mime-encoding subtitles.srt
utf-8またはus-asciiと表示されれば、ファイルは問題なく、悪いのはプレイヤーです。iso-8859-1やunknown-8bitなら、古いコードページです。このコマンドはどのコードページかまでは判別できないので、表の言語で判断してください。
字幕の文字コードを直す3つの方法
- テキストエディタでUTF-8として保存し直す:無料で、1ファイルならすぐ終わります。
- FFmpegで変換する:コマンド1つで、どのコードページにも対応し、Windows、Mac、Linuxで使えます。
- プレイヤーやエンコーダーに文字コードを伝える:新しいファイルは要りませんが、直るのはそのプログラムの中だけです。
最初の2つは、どこで再生しても正しく表示されるUTF-8のファイルができます。3つ目は、1台のパソコンの1つのプログラムでしか効かない回避策です。
方法1: メモ帳またはテキストエディットで字幕ファイルをUTF-8で保存する
Windowsの場合は、.srtをメモ帳で開きます。UTF-8として正しくないファイルは、メモ帳がWindowsのシステムのコードページで読み込みます。ファイルがシステムと一致していれば、これで問題ありません。たとえば日本語版Windowsなら、日本語のファイルは正しく開きます。テキストが正しく見えたら、「ファイル → 名前を付けて保存」を選び、「エンコード」を「UTF-8」にして、別の名前で保存します。メモ帳でもテキストがおかしいなら、システムのコードページがファイルのものと違うので、方法2を使ってください。
Macの場合は、テキストエディットでファイルを開くときに文字コードを選べます。Appleの正しく表示されない文字についてのガイドに手順があります。「開く」ダイアログで「Show Options」(オプションを表示)をクリックし、「Plain Text Encoding」(標準テキストのエンコーディング)メニューから文字コードを選びます。字幕の言語に合うものを選び、テキストが正しく読めることを確認してから、UTF-8のコピーとして保存します。保存時の既定の設定は、「TextEdit → Settings → Open and Save」(開く/保存)のPlain Text File Encodingにあります。
制約は2つあります。1ファイルずつしかできないことと、開いた時点でテキストが正しく見える場合にしか使えないことです。まだ文字化けしているファイルは、決して保存しないでください。間違った文字がUTF-8として固定されてしまいます。
方法2: FFmpegで字幕をUTF-8に変換する
FFmpegは、-sub_charencで指定した任意のコードページの字幕ファイルを読み込み、出力をUTF-8で書き出します。FFmpegのドキュメントは、このオプションを「入力字幕の文字エンコーディングを設定する」と説明しています。使うのは、自分の言語の行です。以下はどれも、テスト用のファイルで実際に実行しました。
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のwikiの字幕の文字コードのページに手順があります。「Tools → Preferences」を開き、「Subtitles / OSD → Default encoding」を選びます。コードページを選んで「Save」を押し、VLCを再起動します。症状の表の2行目と3行目には、これで対処できます。ただし変わるのはそのパソコンのVLCだけで、同じファイルは、テレビやスマートフォン、メディアサーバーでは相変わらず文字化けします。
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で描き、ハングルはインストール済みの別のフォントから持ってきました。四角は出ませんが、意図しない、フォントが混ざった見た目になります。四角が出るのは、その文字体系を扱えるフォントがマシンに1つもない場合で、サーバーや、内蔵フォントが少ないプレイヤーで起こります。
対処は、その言語を扱えるフォントを指定することです。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で書き出します。文字起こしはUnicodeから始まるので、ファイルにコードページが入り込むことはなく、同じ書き出しファイルが、韓国語でもトルコ語でもアラビア語でも正しく読み込まれます。
フォントは言語ごとに扱います。翻訳レイヤーにはそれぞれ独自のスタイルがあり、選んだ字幕フォントがその文字体系を描画できないときは、システムに付属するフォントに置き換えます。韓国語ならWindowsはMalgun Gothic、MacはApple SD Gothic Neo、日本語ならYu Gothic UIとHiragino Sans、簡体字中国語ならMicrosoft YaHeiとPingFang SCです。プレビューは焼き込みと同じフォントを使うので、確認した見た目がそのまま描画されます。
正直に言うと、制約が1つあります。Sablateの.srtと.vttの読み込みは、ファイルをUTF-8として読み、古いコードページは検出しません。古いファイルは、方法1か方法2で変換してから読み込んでください。エディタと書き出しのそのほかの機能は、機能の概要にあります。
| 古いコードページの読み込み | 得られるもの | 対応OS | 価格 | |
|---|---|---|---|---|
| メモ帳 | システムのコードページのみ | ファイルのUTF-8コピー | Windows | 無料 |
| テキストエディット | 可能。開くときに選択 | ファイルの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とテキストエディットはどんな古いコードページも読み込めますが、Sablateは読み込めません。Sablateが向いているのは、字幕を作る場面、特に複数の言語で作る場面で、そもそもこの修復が要らないファイルがほしいときです。
どの方法を使うべきですか?
自分のパソコンのVLCで、1つのファイルだけおかしい場合:VLCの「Default encoding」を変更するか、ファイルを一度変換して、それで終わりにします。
テレビやスマートフォン、Plex、YouTubeで再生する必要がある場合:方法1か方法2でUTF-8に変換します。ほかの端末は、あなたのVLCの設定を共有しません。また、YouTubeの字幕ファイルのページには、SRTは「プレーンなUTF-8である必要がある」と書かれています。
éとöが表示される場合:ファイルはすでにUTF-8です。プレイヤーのほうを直すか、メモ帳でBOM付きUTF-8のコピーを保存して、ファイル自身が文字コードを示すようにします。
字幕を焼き込む場合:FFmpegのコマンドでcharencを使うか、先に変換します。そのあとで、その言語に合うフォントを確認します。
疑問符が表示される場合:変換はやめて、元のファイルを探します。文字は、このファイルの中にはもうありません。
字幕を二度と文字化けさせない方法
字幕ファイルは、必ずUTF-8で保存します。メモ帳なら、「名前を付けて保存」の「エンコード」で選びます。ANSIは避けてください。Macでは、テキストエディットの保存時の文字コードを、一度UTF-8に設定しておきます。
編集する前に変換します。文字化けしたファイルを編集してから変換すると、1つのファイルに2つの文字コードが混ざり、修復がずっと難しくなります。
変換したコピーが、実際に再生する場所(テレビ、メディアサーバー、サイト)で正しく表示されるまで、元のファイルは残しておきます。古い端末がUTF-8をまだ読み間違えるなら、BOM付きUTF-8で保存したコピーでたいてい解決します。BOMが、推測するしかないプログラムに、そのファイルがUTF-8だと知らせるからです。
字幕をゼロから作るなら、文字コードも正しく作る作業の一部です。SRTファイルの作成方法では、WindowsとMacの保存ダイアログの落とし穴を説明しています。
古い字幕を直すのではなく、字幕を新しく生成するなら、UTF-8で書き出し、言語ごとにフォントも選んでくれるツールから始めましょう。WindowsまたはMac向けのSablateをダウンロードして、100の文字起こし言語のどれでも、最初のファイルを書き出してください。
よくある質問
字幕が文字化けするのはなぜですか?
プレイヤーがファイルを間違った文字コードで読み込んでいるためです。字幕ファイルには、どの文字コードで保存されたかが記録されていません。そのためプレイヤーが推測し、推測が外れると、アクセント付きの文字や非ラテン文字が記号に変わってしまいます。ファイルをUTF-8に変換するか、ファイルが保存されたコードページをプレイヤーに伝えれば、文字は元に戻ります。
字幕ファイルをUTF-8に変換するにはどうすればよいですか?
ファイルを正しく読み込めるテキストエディタで開いて、UTF-8のコピーとして保存します。もう1つの方法は、ファイルの古いコードページを指定してFFmpegを実行することです。たとえばトルコ語なら、ffmpeg -sub_charenc CP1254 -i input.srt output.srt と入力します。FFmpegは新しいファイルをUTF-8で書き出します。元のファイルを削除する前に、プレイヤーで結果を確認してください。
VLCで字幕の文字コードを変更するにはどうすればよいですか?
「Tools」、「Preferences」、「Subtitles / OSD」の順に開き、「Default encoding」の一覧からファイルのコードページを選びます。「Save」をクリックしてVLCを再起動すると、変更が反映されます。この設定で直るのは、そのパソコンのVLCでの再生だけです。テレビやスマートフォン、ウェブサイトでも再生する必要があるなら、ファイルをUTF-8に変換してください。
字幕が文字ではなく疑問符になるのはなぜですか?
その文字を収められない文字コードでテキストを保存したときに、文字が失われたためです。たとえば韓国語やロシア語の字幕を西ヨーロッパ言語のテキストとして保存すると、収められない文字は1つ残らず疑問符として記録されます。どんな変換でも元には戻せないので、元のファイルを探すか、元データから書き出し直す必要があります。
FFmpegの「Invalid UTF-8 in decoded subtitles text」とはどういう意味ですか?
FFmpegはUTF-8の字幕ファイルを想定していたのに、古いコードページのバイトを見つけたという意味です。解決策はFFmpegのメッセージ自身が示しています。-i の前に、ロシア語ならCP1251、韓国語ならCP949のように、ファイルの文字コードを付けた -sub_charenc を追加します。ファイルを焼き込むときは、subtitlesフィルターのcharencオプションを使います。
字幕ファイルにはどの文字コードを使うべきですか?
UTF-8です。1つの文字コードですべての文字体系を扱えるので、同じファイルがどの言語でも、どの端末でも正しく読み込まれます。YouTubeはSRTファイルにプレーンなUTF-8を求めており、プレイヤーやテレビ、メディアサーバーも、古いWindowsのコードページよりずっと確実に読み込みます。古い端末がUTF-8のファイルをまだ読み間違えるなら、BOM付きUTF-8で保存し直してみてください。