21.2.1 ロケールの背景、詳細、ヒント、助言および補足説明

C 標準では、ロケールはプログラム全体にわたる特性であり、その変更は 高価な処理であるとしています。加えて、頻繁にロケールを変更する ようなひどい実装はコアダンプを引き起こすこともあります。 このことがロケールを正しく利用する上で苦痛となっています。

そもそも、プログラムが起動した際、ロケールはユーザの希望するロケール にかかわらず "C" です。プログラムは setlocale(LC_ALL, '') を呼び出して、明示的にユーザの希望する ロケール設定を行わなければなりません。

setlocale() をライブラリルーチン内で呼ぶことは、 それがプログラム全体に及ぼす副作用の面から、一般的によくない考えです。 ロケールを保存したり復帰したりするのもよくありません: 高価な処理 であり、ロケールの設定が復帰する以前に起動してしまった他のスレッド に悪影響を及ぼすからです。

もし、汎用を目的としたモジュールを作っていて、ロケールによって 影響をうけるような操作 (例えば string.lower()time.strftime() の書式の一部) のロケール独立の バージョンが必要ということになれば、標準ライブラリルーチンを 使わずに何とかしなければなりません。よりましな方法は、ロケール設定が 正しく利用できているか確かめることです。最後の手段は、 あなたのモジュールが "C" ロケール以外の設定には互換性がない とドキュメントに書くことです。

string モジュールの大小文字の変換を 行う関数はロケール設定によって影響を受けます。setlocale() 関数を呼んで LC_CTYPE 設定を変更した場合、変数 string.lowercasestring.uppercase および string.letters は計算しなおされます。 例えば from string import letters のように、 `from ... import ...' を使ってこれらの変数を 使っている場合には、それ以降の setlocale() の影響を 受けないので注意してください。

ロケールに従って数値操作を行うための唯一の方法はこのモジュールで 特別に定義されている関数: atof()atoi()format()str() を使うことです。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。