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

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

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

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

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

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

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