質問: C言語のプログラムでsetlocaleの使い方がわかりません。 以前はUNIX環境で日本語を正しく表示するには次のことをしなければならなりませんでした。 - 環境変数LANGやLC_ALLなどの設定 - ターミナルソフトの言語設定 今となってはUTF8一択のような感じですが、この時代SJISで作ったプログラムをロケールがEUCのシェルで正しく表示するようなやり方があったのでしょうか? 結局、iconvなどを利用して文字コード変換をする必要があったのでしょうか。 私が調べた限りでは次の通りでした。 - setlocaleは通貨や、時間表記に非常に影響を与える。 - POSIXの定義( )によるとisalphaなどの関数がsetlocaleの影響を受ける。 - → printfなども影響を受けるが、単なるバイトの列である文字コードの変換は行ってくれなさそう・・・(実験済み) - 文字列を直でprintfしてもダメだが、メッセージカタログや、gettextなどには影響がありそう - ELFなどの実行バイナリフォーマット文字列に関する文字コード情報はない わかりづらい場合はその旨コメントで書き込んでいただければと思います。直していきたいと思います。
回答: setlocale は、国際化(i18n:internationalization)の仕組みのうちのひとつです。 いろいろな国の言語に対応しようと思うと、文字コード(charset)だけではなく、 * 語句の出現順序 * 区切り文字 なんかも違ってくるので、そこらあたりを楽にしようという仕組みです。 日本語の文字コードが SJIS だ EUC だ、というのは、その仕組みに乗っかって一部だけを利用しています(五区の出現順序や区切り文字は、日本語という範疇で同じなので)。 質問に挙げられた pubs.opengroup.org であれば、以下のようなページの方が本質に近いです。 * * man なら、セクションが 5 とか 7 とか。 i18n の目指すところは、 * 言語による差異を、プログラムではなく、外部のファイルに逃がすことができる * ある言語に対応するときに、プログラムを変更せずとも、外部のファイルを追加することで対応できる です。 setlocale 関数だけに絞って言うと、問い合わせ(第2引数が NULL)以外では使った記憶がありません。 言語によって、文字数が変わるので、切り替えたりするとか。 日本語の文字コードの範囲に絞ると、入力 or 出力の文字コードだけの話になるので、 > この時代SJISで作ったプログラムをロケールがEUCのシェルで正しく表示するようなやり方があったのでしょうか? > > については、入力 or 出力を iconv のようなコマンドで変換するという方法を使いました。 「この時代SJISで作ったプログラム」というのが、i18n にのっとったプログラムであれば、EUC に対応してないプログラムでも EUC の外部ファイルを用意すれば文字化けせずに動作しますが、i18n にのっとっているプログラムであれば「SJIS で作ったプログラム」という表現はされないと思うので、文字コードを変換するコマンドを間に挟むしかありません。