LinuxでシフトJISが使えた

ふと、最近の Linux って EUC-JP ロケール使えるんだっけ? と思ったんで調べてみた。環境は Ubuntu 22.04。

EUC-JP ロケール

locales パッケージが入ってない場合はロケールはこれだけ:

% locale -a
C
C.utf8
POSIX

locales と language-pack-ja をインストール:

# apt install locales language-pack-ja

locale-gen コマンドを実行すると ja_JP.utf8 が増える:

# locale-gen
Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.

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

/etc/locale.gen ファイルの ja_JP.EUC-JP をコメントアウト:

...
# it_IT@euro ISO-8859-15
# iu_CA UTF-8
ja_JP.EUC-JP EUC-JP
# ja_JP.UTF-8 UTF-8
# ka_GE GEORGIAN-PS
...

locale-gen コマンドを実行すると:

root@7a55c1aa3aba:/# locale-gen
Generating locales (this might take a while)...
  ja_JP.EUC-JP... done
  ja_JP.UTF-8... done
Generation complete.

EUC-JP ロケールが増えた:

# locale -a
C
C.utf8
POSIX
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

これでロケールとしては使えるようになるんだけど、端末が UTF-8 のままだと当然文字化けする。

端末のロケールを設定するには xfce4-terminal だと「設定」→「上級者」→「エンコーディング」で。

または、ロケール指定で端末を起動する。最近の端末は1プロセスで複数のウィンドウを表示してるので、別のプロセスとして起動する必要あり。

% LC_ALL=ja_JP.eucjp xfce4-terminal --disable-server

ちゃんと文字化けせずに表示された。 あいうえおa4 a2 a4 a4 a4 a6 a4 a8 a4 aa になってるので、ちゃんと EUC-JP になってることがわかる。

SJIS ロケール

locale-gen コマンドは /etc/locale.gen を使って localedef コマンドを呼び出してるので、locale-gen ではなく直接 localedef コマンドを使ってもいい:

# localedef --inputfile ja_JP --charmap EUC-JP ja_JP.EUC-JP
# locale -a
C
C.utf8
POSIX
ja_JP.eucjp

locale-gen のように、ja_JP.ujis とか japanese とかをエイリアスとして設定したい場合は、次のようにエイリアスファイルを指定する:

# localedef --inputfile ja_JP --charmap EUC-JP --alias-file /etc/locale.alias ja_JP.EUC-JP

--inputfile/usr/share/i18n/locales 内のファイル、--charmap/usr/share/i18n/charmaps 内のファイルを指定する。

/etc/locale.gen には書かれてないけど、/usr/share/i18n/charmaps/SHIFT_JIS.gz というファイルもあった。ん?実はシフトJISロケールも作れるのでは…。

試してみる:

# echo ja_JP.SJIS SHIFT_JIS >> /etc/locale.gen
# locale-gen
Generating locales (this might take a while)...
  ja_JP.SHIFT_JIS...[warning] character map `SHIFT_JIS' is not ASCII compatible, locale not ISO C compliant [--no-warnings=ascii]
 done
Generation complete.
# locale -a
C
C.utf8
POSIX
ja_JP.sjis
japanese.sjis

警告は出るけど作れたっぽい。

xfce4-terminal を EUC-JP のときと同じようにしてエンコーディングを「SHIFT_JIS」で起動。

ちゃんとシフトJISになった。

端末の中で vim を起動してもちゃんと日本語編集できた。

MySQL もちゃんと使えた。

Linux はシフトJIS使えたんだなー。今まで知らなかったわ…。