※ ChatGPTを利用し、要約された質問です(原文:文字コード(多言語化?)の取り扱いについて)
文字コード(多言語化?)の取り扱いについて
このQ&Aのポイント
多言語化や複数プラットフォームでの動作について考える必要が出てきた。
文字コードの設定に関して、UNICODE文字セットを使うという選択肢がある。
コード内でのTCHARやLの扱いについて、基本的な表記法を誤っている可能性がある。
正直な話今まで多言語化とか複数プラットフォームでの動作といったことは
あまり考えていなかったのですが(作った環境限定で動かしたりしてた)
今回その一歩としてまず文字コードの設定を気にしだしました
そこでまず理解できないのが 現在 UNICODE文字セットを使う 設定でソースを作り
TCHAR msg[100];
_stprintf_s(msg, L"Error (0x%x) (%d)\n", hr, __LINE__);
といったようなコードを書きました 当然その環境ではコンパイルして動くのですが
文字コードセットを 設定なし にしてリビルドするとそのコードでは
error C2665: 'sprintf_s' : 2 オーバーロードのどれも、すべての引数の型を変換できませんでした
といったエラーが出ます
TCHARやL としてコードを書いておくことで _UNICODEデファインの有無により
自動的にwhar_tやcharへの変換が行われると思っていたのですが
基本的な表記法を間違っているのでしょうか?
それとも文字セットはそういったことではなくunicode文字セットにしたときは
多国語サポートを考慮して作っているので
それで書いたソースを文字セット 設定なし でそのまま再構築できるという
考え方のほうが間違っているのでしょうか
(そんなのかえたらソース変更が当たり前 ってことなんでしょうか?)
変えられる可能性があるのはマルチバイト文字セットのみ?
環境は VS2010(VC2010)です
お礼
すいません 試行錯誤した上で _T より L のほうがいいのかと思い変更したのが悪さをしたようです (何かで _T でワーニング出て L で直った気がしますがそれも間違いかもしれません) 今回の件はご指摘のように_T に変更することでコンパイル通ることを確認したので 他の部分も同様に修正かけたいと思いますが別の問題が出てしまいました TCHAR msg[100]; BSTR buf = ::SysAllocString(msg); というコードがあり unicode ではコンパイルできますが 無指定だと error C2664: 'SysAllocString' : 1 番目の引数を 'TCHAR [100]' から 'const OLECHAR *' に変換できません。(新しい機能 ; ヘルプを参照) この場合は const OLECHAR * にキャストするしかないのでしょうか? その他にもいくつか方が合わなくなってしまう部分があるようなのですが そういった場合も最終的にはキャストなりで合わせこむしかないのでしょうか? よろしければお教え願います いずれにしても動作確認はする必要あるとは思ってます 回答ありがとうございました
補足
時間空きましたが何パターンかコンパイルオプション変更しても リコンパイルで動くようにはなりました 未だ多国語 まではいきついていないのが実情ですが 時間を見て調べていきたいと思います