hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

C++/CLIではsetlocaleは効かない?

EBWin4が英語Windowsで文字化けするという報告があり、「C#の文字列はUnicodeなのにおかしいな」と思って調べていたが、ようやく解決。
C言語C++ではsetlocale関数で言語環境を切り替えることができる。Visual C++のマルチバイト関数のmbstring.hにある関数群はこのシステムロケールの影響を受ける。EBWinでは setlocale(LC_ALL,"Japanese")でロケールを日本語に指定しており、EBWin4でも同様だった。ところが、EBWinはプログラム全体がC++ネイティブなのに対して、EBWin4はC# & C++/CLI というハイブリッド環境である。どうやらC++/CLIでラップしたdll内でsetlocaleを実行しても、効果が保存されないらしい。
結局、mbstring系の関数の使用をあきらめ、同等の機能を持つ互換ライブラリで置き換えることにした。これはもともとmbstringを持たないWindowsCE用のもので、iOSAndroid版でもmbstringの代わりに使用している実績がある。
これで英語Windowsで動作することを確認したので、4.0.18で中国語のメニューリソースを追加してみた。純粋な中国語Windowsが手元にないが、Windows7 Ultimate+言語パックで動作確認できている。これがうまくいけば、多言語対応の道が開ける。