過去いた会社で、全UNIX環境の日本語動作の検証責任者になったことがある。現地の開発へ向かい、どの日本語環境でも、正しく日本語表示の絶対命令が。。。SUN Solarisは、EUCとSJIS、IBM AIXは、SJIS、HP-UXは、EUCとSJISで動作させろと。。。
まぁ、海外ソフトなんて、まぁ動かん。現地のエンジニアなんて、「お前は、日本語でSJISを話すのか?それとも日本語EUCか?」なんて言ってくるし。
さらにSJISには、UNIX SJISとWindows CP932があり、Windows CP932なんで、①、②とかⅰ、ⅱ、ⅲ、ⅳや(株)とか日本人が大好きな文字や、ASCIIの改行コードを含む文字がありトラブルの温床。SJISって、完全2バイトではなく、マルチバイトで、文字の切れ目が変則的。人が作ったテストデータを見るだけで、その苦しみをわかっているか、聞きが齧っただけで知らないがわかる。
時は変わって、UTF-8は全部2バイトかと思えば、3バイトの文字もあったり。。。テキストボックスの長さがバイト固定だと規定どおり?に入力ができない。ちなみに、これまた、聞きかじっただけの人が言う、UTF-8はユニコードだというのは、違います。。。
しかし、そのソフトウェアほんと動かない。現地に飛び、あと帰国まで3日(87日目)のところで、原因判明。
OSのロケールに日本語が入っておらず、適切に設定されていなかった。。。
全てのビルドマシンに対応言語のロケールをインストールして、次の日帰国した。それ以外、日本語だけではなく、サポートする文字コードの全てで問題は、消滅した。各プラットフォームのUNIXとLinuxマシンの再セットアップは、修行だった。日本語環境でいれてしまうと現地の人は読めないので、英語環境で、ロケールとマルチバイトライブラリを入れていくなんて。
日本語って、単一言語で、複数文字コードをもつ、稀有な言語で、言語だけではなく、単位とか時間表記とか、みんなセットでローカライズしてくれるので、文字コードだけではなく、日付関連でも問題が起きることがある。。。なので、文字コードだけとは限らない。
まぁ、今のLinuxは、UTF-8一発なので、まぁ気にすることはないし、ロケールをCにしておけば、あとは、プログラマさんたちがマルチバイト対応している方の関数を使ってくれれば問題はないはず。
閑話休題
Linuxで、SJIS/EUC/UTF-8のロケールを入れる方法
Ubuntu
以下のコマンドを実行
apt -y install language-pack-ja
sed -i -e "s/# ja_JP.EUC-JP EUC-JP/ja_JP.EUC-JP EUC-JP/g" /etc/locale.gen
echo ja_JP.SJIS SHIFT_JIS >> /etc/locale.gen
locale-gen
RHEL系(RHEL/Oracle Linux/CentOS)
以下のコマンドを実行
RHEL7
localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
RHEL8
dnf -y install glibc-locale-source glibc-langpack-ja
localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
インストール後の確認
locale -a | grep ja
localectl list-locales | grep ja
ちなみに、ja_JP.ujisは、EUC。昔は、UJISと言われていた。
RHEL9だとlocale -aでは正しく表示されるのだが、localectlだと表示されないんですよね。なんでだろう。
ロケールを変えるには
LANG=ja_JP.eucjp
で変えるか
localectl set-locale LANG=ja_JP.eucjp
で変える。ロケールを変えると、エラーメッセージも場合によっては日本語で表示される。
さらにロケールを変えた場合は、ターミナルの文字コードを変える必要がある。MACのiterm2の場合、以下。
なんかたくさんあるぞ。闇なので追わないw
LInuxのSJISのデータを参照するのに、CP932 (Windows, DOS)で大丈夫かと思って設定したら、表示できなかった。Shift JISなら問題なかった。MACの端末のせいかな?
実は、MACの場合は、さらにさらに厄介なことがあり、以下の設定を変えないと、ちゃんと表示してくれない。
ターミナルの場合
Set locale environment variables on startupのチェックをオフ
iTerm2の場合
Set locale variable automaticallyをオフ
一つのフォルダにそれぞれの文字コードのフォルダを作って、ファイルを作ってみた。