LinuxでShiftJISの文字化けを直す方法

最近のLinuxシフトJISSJIS)をサポートしてない場合があります.
その場合,moreやless,vimシフトJISのファイルを開くと文字化けします.

Windowsで作成したソースコードやテキストファイルが文字化けする場合は文字コードだけでなく,LinuxがShiftJISをサポートしているかどうかもチェックするようにしましょう

Linuxがサポートしている文字コードを確認する

文字コードにはUTF-8EUC,Shift JISなど様々な種類があります.システムが,これら文字コードに対応するには「ロケール」と呼ばれる情報を持っておく必要があります.

まずはシステムにインストールされているロケールの一覧を確認します

locale -a

実行するとインストール済みのロケールの一覧が表示されます

C
POSIX

CとPOSIXしか表示されない場合は,シフトJISどころかUTFも使えません

日本語に関連するロケール

ロケール 別名
ja_JP.EUC-JP EUC-JP
ja_JP.UTF-8 UTF-8
ja_JP.SJIS SHIFT_JIS

です

SHIFT JISを使いたい場合は ja_JP.SJISロケールをインストールする必要があります

ロケールのインストール

ubuntuの場合は language-pack-ja というパッケージをインストールします

$ apt install locales language-pack-ja

インストール後に もう一度ロケール一覧を確認してみます

$ locale -a
C
C.utf8
POSIX
ja_JP.utf8

ja_JP.utf8 が増えましたが,まだ shift jis は含まれていません

ロケールデータベースの更新

ロケールデータはサイズが大きくなるので,デフォルトではシフトJISは無効になっています

設定ファイルを編集してシフトJISを有効にします

/etc/locale.gen をroot権限で編集します

$ sudo vi /etc/locale.gen

一行追加します

ja_JP.SJIS SHIFT_JIS

/etc/locale.genを更新したら,データベースを更新するコマンドを実行します

$ locale-gen
Generating locales (this might take a while)...
  en_US.UTF-8... done
  ja_JP.SHIFT_JIS...failed to set locale!
[warning] character map `SHIFT_JIS' is not ASCII compatible, locale not ISO C compliant [--no-warnings=ascii]
 done
Generation complete.

警告が出ていますが,無視して大丈夫です.

localeを確認します

$ locale -a

ja_JP.sjis の表示が増えれば成功です

同様の手順で EUC も有効にできます

手順は

  • /etc/locale.gen に
ja_JP.EUC-JP EUC-JP

を追加して,sudo locale-gen を実行するだけです

仕組みについて

ロケールの情報は

などの定義が含まれています

たとえば文字コードの変換表はディレクトリ /usr/share/i18n/charmaps 以下に格納されています

具体的には

これらは定義情報だけを持っていて,必要な定義だけを /etc/locale.gen に設定しておくと,locale-genコマンドが実際のロケールのデータベースを構築する,という流れになっています