Visual C++ 2010 の setlocale 関数の問題について
こんにちは、Visual Studio サポート チームです。
今回は、Visual C++ 2010 で確認されている setlocale 関数の問題と対処方法についてご案内します。なお、本問題は Visual C++ 2012 以降のバージョンでは修正されています。
現象
Visual C++ 2010 の setlocale 関数において、以下のような現象が発生する場合があります。
a) 引数に不正なロケール (例 : "Japanese_Japan.9326389") を指定しても、NULL ポインターが返却されない
b) 上記 a) の問題が発生した状態から、正しいロケールを指定して setlocale 関数を実行しても、処理に失敗して NULL ポインターが返却される
原因
本現象は Visual C++ 2010 の setlocale 関数の不具合に起因して発生しています。製品の不具合でご迷惑をおかけしておりますこと深くお詫び申し上げます。本不具合は Visual C++ 2012 以降のバージョンの製品では修正されています。
対処策
a) の問題については、正しいロケールを指定するようアプリケーションを修正してください。ロケールの詳細については以下のドキュメントをご参照ください。
ロケール名、言語、および国/地域識別文字列
(英語原文) https://msdn.microsoft.com/en-us/library/hzz3tw78.aspx
(日本語訳) https://msdn.microsoft.com/ja-jp/library/hzz3tw78.aspx
b) の問題については、setlocale 関数でロケールを変更する前に、一度、引数に "C" を指定して本関数を実行することでロケールをリセットしてから、改めて、変更したいロケールを指定して実行することで対応可能です。
// ==============================
// コード例
// ==============================
// 不正なロケールが設定され本件の問題が発生します
char * pszLoc = setlocale(LC_CTYPE, "Japanese_Japan.9326389");
// "C" を指定してロケールを ANSI の最小構成にリセットします
pszLoc = setlocale(LC_CTYPE, "C");
// 改めて目的のロケールにセットしなおします
pszLoc = setlocale(LC_CTYPE, "Greek_Greece.1253");
弊社製品の問題でご迷惑をおかけし誠に申し訳ありませんが、setlocale 関数をご利用の際に問題が生じた場合は上記内容についてご参考いただけますと幸いです。