ロケール・センシティブな関数として
fprintf | gmtime | isalnum |
localeconv | localtime | mktime |
printf | setlocale | sprintf |
strcol | strftime | strxfrm |
time | tolower | toupper |
vfprintf | vprintf | vsprintf |
がある。
これらはシステム値 : QLOCALE
の影響を受けて、特に toupper
と tolower
は QLOCALE
が 5026環境 :
/QSYS.LIB/JA_JP_5026.LOCALE
であれば、確実に動作しない。
このことは致命的な障害の発生の元となってしまう。
5026環境 : QLOCALE
とは 環境変数 : LANG
を設定する元として使用されるものであり主に Java や
QSHELL 環境で参照されることを目的として IBM が用意している。
OS V5R1M0 までは QLOCALE の導入時の値は *NONE であったが V5R2M0 からは
/QSYS.LIB/JA_5035.LOCALE
の値が導入時にも設定されるようになった。
Java や QSHELL で英小文字を使用するには、この値が正しい値である。
ところが システム値 : QCCSID = 5026
環境の場合、特約店のSE が十分な理解のないままに、
5026 であるから、この値も 5026 にする必要があるのではないかと考えて
/QSYS.LIB/JA_JP_5026.LOCALE
に設定してしまうと toupper
や tolower
関数は動作しなくなってしまう。
このような誤った環境下でも確実に toupper や tolower 関数を正常に動作させるには使用の直前に
setlocale
関数によってロケールを変更してしまうことである。
( putenv
で 環境変数 LANG
を変更しても直ちに有効にはならないので setlocale 関数によって
セットすることが望ましい。)
以下に例を示す。
----------------------------------------------------------------- int m_bLocale = FALSE; /**********************/ void strupr(char* str) /**********************/ { int i; if(m_bLocale == FALSE){/*LOCALE 対応 */ setlocale(LC_CTYPE, "/QSYS.LIB/JA_5035.LOCALE"); m_bLocale = TRUE; }/*LOCALE 対応 */ for(i = 0; i<strlen(str); i++){/*for-loop*/ str[i] = toupper(str[i]); }/*for-loop*/ } -----------------------------------------------------------------
この関数 strupr
は、任意の文字列のすべての文字を英大文字に置き換える関数であり、
弊社では汎用的な関数としてサービス・プログラムで公開使用している。
あるユーザーで試供版が動作せず、丹念な調査を重ねても strupr が動作していないことまでは判明したが
何故、動作しないのかは長い間、不明のままであった。
この対応によって、またひとつ安定動作を向上させることができるようになったのである。