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使えたんだなー。今まで知らなかったわ…。
Discussion