将棋ソフトから書き出した KIF ファイルをテキストエディタや別のアプリで開くと、こんなふうに見えることがあります。
���F���i�T���v���j
���F���i�T���v���j
ファイルが壊れたように見えますが、壊れてはいません。ほぼすべてのケースで、原因は文字コードの読み違いです。この記事では、なぜ起きるのか、手元でどう直すのか、そして棋譜を読み込むアプリがどうやって自動判別しているのかを説明します。
なぜ文字化けするのか
テキストファイルは、中身が「どの文字コードで書かれているか」を持っていません。開く側が推測して読みます。
KIF 形式は古くからある形式で、Shift_JIS で保存されることが多いです。一方、今のエディタやWebアプリの多くは UTF-8 を前提に読みます。Shift_JIS のバイト列を UTF-8 として解釈すると、日本語の部分がまったく別の文字(か、変換できない記号)になります。これが文字化けの正体です。
逆もあります。UTF-8 で保存された KIF を、Shift_JIS 前提の古いソフトで開くと、同じように化けます。
手元で直す:エディタで「文字コードを指定して開き直す」
一番早いのは、エディタの「エンコーディングを指定して再読み込み」で Shift_JIS を選ぶことです。ほとんどのエディタに、この機能があります。
- 文字化けしたファイルを開いたまま、「エンコーディングを指定して開き直す」に相当するメニューを探す
- Shift_JIS(表記は「Shift JIS」「SJIS」「CP932」「Windows-31J」などの場合もあります)を選ぶ
- 正しく表示されたら、必要に応じて UTF-8 で保存し直す
3を行っておくと、以後どのアプリでも化けにくくなります。ただし、Shift_JIS 前提の古い将棋ソフトに戻して読ませる可能性があるなら、元のファイルは残しておいてください。
「そもそも何のコードか分からない」とき
見分け方の目安です。
- 日本語の部分が
���のような同じ記号の連続になる → Shift_JIS を UTF-8 で読んでいる可能性が高い - 日本語の部分が意味のない漢字・カナの羅列になる → UTF-8 を Shift_JIS で読んでいる、あるいはその逆
- 全部が化けているのではなく、数字と記号(
1、(77)、0:00)は正しく読める → 文字コードの問題で確定。KIF の指し手行は1 7六歩(77) ( 0:00/00:00:00)のような形で、半角の数字・括弧・コロンは Shift_JIS でも UTF-8 でも同じバイトなので、そこだけ生き残ります
最後の目安は便利です。手数と時間の欄が読めているなら、ファイルは無事です。
アプリ側で自動判別する仕組み
利用者にこの作業をさせたくないので、Ponder(チェス・将棋の検討盤)では棋譜ファイルを読むときに文字コードを自動で判別しています。仕組みは単純で、まず UTF-8 として厳密に読み、失敗したら Shift_JIS で読み直すだけです。
async function decodeFile(file: File): Promise<string> {
// KIFはShift_JISで保存されていることが多い。UTF-8として不正ならShift_JISで読み直す
const buf = await file.arrayBuffer();
try {
return new TextDecoder('utf-8', { fatal: true }).decode(buf);
} catch {
return new TextDecoder('shift_jis').decode(buf);
}
}
ポイントは { fatal: true } です。ブラウザの TextDecoder は既定では、UTF-8 として不正なバイトを置換文字(�)に置き換えて黙って通します。これでは判別できません。fatal: true を付けると、不正なバイト列に当たった時点で例外を投げるので、「UTF-8 ではなかった」と分かり、Shift_JIS で読み直せます。
この順番(UTF-8 → Shift_JIS)にしているのは、UTF-8 は構造上「たまたま UTF-8 として正しく読めてしまう Shift_JIS のバイト列」がほとんど無く、逆は起こりうるからです。厳密な方を先に試すと、判定が安定します。
読み込めば、以降の処理(KIF / KI2 / CSA / JKF の形式判定、指し手の解釈、盤面の再現)は文字コードを意識せずに進みます。
それでも読めないとき
上の2種類で読めないファイルは稀ですが、あるとすれば次のどれかです。
- ファイルが本当に壊れている(途中で切れている、途中から別のデータが混ざっている)。指し手行の途中で終わっていないか確認してください
- KIF ではない(KI2 / CSA / JKF など別形式)。これは文字化けではなく「形式が違う」なので、対応しているアプリなら文字コードの判別後にそのまま読めます
- UTF-16 など、さらに別の文字コード。将棋ソフトの書き出しではまず見ませんが、Windows のメモ帳などで「Unicode」を選んで保存し直した場合に起こります。エディタで UTF-8 に保存し直せば直ります
まとめ
- KIF の文字化けは、ほぼ「Shift_JIS を UTF-8 で読んだ(またはその逆)」
- 数字と記号が読めていればファイルは無事。エディタで Shift_JIS を指定して開き直せば見える
- アプリ側は
TextDecoder('utf-8', { fatal: true })で厳密に試してから Shift_JIS に落とすだけで、自動判別できる
文字化けしたファイルをそのまま Ponder に読み込ませれば、上の仕組みで判別して開きます。開いたあとは、気になる局面で「なぜこの手?」と聞いて、回答の指し手を押して盤で確かめてみてください。