質問: C++6.0,VB6.0,VBA(Excel2000)で作成したWindowsアプリケーション(Windows2000(日本語版)向け)をWindowsXP SP2(英語版(Excel2003英語版))に対応したいと考えています。 MicrosoftのHPには、「言語をUnicodeにする必要がある」等いろいろと書いてあるのですが、「何をしなければいけない」「ここをチェック」等の記載がありません。 何かご存じの方、参考書籍、参考HP等あればお教えください。 【アプリの特徴】 ・レジストリの読書有 ・Win32API使用(iniファイルの読込等) ・ExcelCOM使用 ・GUIは英語
回答: Google >「・・・Unicodeビルトにしなくても大丈夫です」とあるのですが、これは「atoi」も使用可能と考えてよろしいでしょうか? Unicodeビルドにしない場合はatoiでも大丈夫です(厳密にはウソですが普通は問題になりません)。 文字列から数値に変換する関数にatoiや_wtoi、_tstoiなどがあります。これらは文字コードの違いによって使い分けます。 たとえばMFCにCStringという文字列クラスがあります。 これは普通の場合はchar*と同等ですよね。ですから CString strData; strData = ”123”; int n = atoi(strData) で問題なく使用できます。 しかし、Unicodeビルドの場合はエラーになります。Unicodeビルドの場合はCStringはWCHAR*と同等になるからです。そのため CString strData; strData = L”123”; int n = _wtoi(strData) とします。これでエラーもなく使えるようになります。このときL”123”というのは文字列をUnicode指定する方法で、_wtoiはUnicode文字列(WCHAR*)から数値に変換する関数です。 上のことから分かるようにUnicodeビルドと普通のビルドではソースコードが大きく変わってしまい不便です。 そのためUnicodeビルドにしてもそうでないときでもエラーが起きないようにプログラミングをすることがあります。そのときに_tstoiを利用します。具体的には CString strData; strData = _T(”123”); int n = _tstoi(strData) こうすると、Unicodeビルドでもそうでないときでもエラーが起きません。_T(””)は文字列をUnicodeビルドのときはWCHAR*として、そうでないときはchar*として扱うものです。_tstoiはUnicodeビルドのときはWCHAR*から数値、そうでないときはatoiと同等の機能を持つ関数です。 このようにatoiと_tstoiを使い分けます。このようなUnicodeビルドとそうでないときに使い分けるべき関数はたくさんあります。atofやatolなんかもそうですし、WindowsNT系で文字列を受け渡す関数の多くはWCHAR*とchar*用とで関数が2種類用意されています。 ちなみにCStringをCStringAとして利用するとUnicodeビルドをしてもchar*として扱うことができますし、同じようにCStringWとすると常にWCHAR*として利用が可能です。 Windowsプログラミングでよく見かけるLPCTSTRというのはCStringと同じでビルドによってchar*とWCHAR*が変わる文字の型です。これはconst TCHARで、TCHARというのはUnicodeビルドのときはWCHAR*になる文字列型になります。