• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:文字コード(多言語化?)の取り扱いについて)

文字コード(多言語化?)の取り扱いについて

このQ&Aのポイント
  • 多言語化や複数プラットフォームでの動作について考える必要が出てきた。
  • 文字コードの設定に関して、UNICODE文字セットを使うという選択肢がある。
  • コード内でのTCHARやLの扱いについて、基本的な表記法を誤っている可能性がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

L"ほげほげ" だと, UNICODE は完全に無視して wchar_t * になると思う. だから「文字コードセットを 設定なし にしてリビルドする」と第2引数が const char * を期待しているのに wchar_t * になってる からエラーになる... ということじゃないかな. で _T(), と.

koi1234
質問者

お礼

すいません 試行錯誤した上で _T より L のほうがいいのかと思い変更したのが悪さをしたようです (何かで _T でワーニング出て L で直った気がしますがそれも間違いかもしれません) 今回の件はご指摘のように_T に変更することでコンパイル通ることを確認したので 他の部分も同様に修正かけたいと思いますが別の問題が出てしまいました TCHAR msg[100]; BSTR buf = ::SysAllocString(msg); というコードがあり unicode ではコンパイルできますが 無指定だと error C2664: 'SysAllocString' : 1 番目の引数を 'TCHAR [100]' から 'const OLECHAR *' に変換できません。(新しい機能 ; ヘルプを参照) この場合は const OLECHAR * にキャストするしかないのでしょうか? その他にもいくつか方が合わなくなってしまう部分があるようなのですが そういった場合も最終的にはキャストなりで合わせこむしかないのでしょうか? よろしければお教え願います いずれにしても動作確認はする必要あるとは思ってます 回答ありがとうございました

koi1234
質問者

補足

時間空きましたが何パターンかコンパイルオプション変更しても リコンパイルで動くようにはなりました 未だ多国語 まではいきついていないのが実情ですが 時間を見て調べていきたいと思います

その他の回答 (3)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.4

>では今回に対して言えばどういった対処を取るべきだといわれるのでしょうか? #3の方がすでに書かれていますが、::SysAllocString()はOLECHARの文字列を要求してるのですからOLECHARの文字列に変換すればいいだけです。 これは::SysAllocString()の仕様を考えればおのずとわかる事だと思いますが。 >そこで固定文字列などを渡したい場合どういった方法とればいいのか >など疑問が満載状態になってしまいます 使用する関数やAPIの仕様から判断してください。 >ベースコードSDKのサンプルなどから持ってきてそういった状態なのですが >サンプルも文字セット気にしないで記載されているということなのでしょうか? 私にそのサンプルの事をたずねられても推測しかできませんが(私が書いたわけじゃないし)。 文字コード変換のサンプルでもない限り、そのサンプルが書かれた当時のそのプラットフォームで標準的に使われていた文字コードで書かれてるというだけじゃないですか。

koi1234
質問者

お礼

回答ありがとうございます ちょっと他の調べものでこちらの作業がなかなかできないのですが 変換マクロがあることはわかりましたのでもう少し時間とれたら ゆっくり確認したいと思うます 簡単にテストしたんですがまた何か勘違いしてるのか マクロ使ってもさらに別のエラーが発生して コンパイルができなくなっただけで解決はしていません 単純なキャストでは変換がきちんとされていないため まともに動かないことの確認はできました

回答No.3

TCHARとOLECHARの変換は http://msdn.microsoft.com/ja-jp/library/805c56f8(v=VS.90).aspx に以下の通り記載されています。つまりT2OLEとOLE2Tマクロを使用すればいいわけです。 以下 引用 OLE 変換マクロ -------------------------------------------------------------------------------- OLE 変換マクロは OLESTR 文字を扱うことを目的とした関数の処理用にデザインされています。OLE のヘッダーをチェックすると、LPCOLESTR と OLECHAR への参照が数多くあるのがわかります。これらの型は、OLE インターフェイスで使用する文字の型をプラットフォームに依存しない方法で参照するために使用されます。OLECHAR は Win16 のプラットフォームでは char に変換され、Win32 では WCHAR に変換されます。 MFC コード中の #ifdef ディレクティブの数を最小に抑えるために、OLE 文字列を扱う変換でも同じようなマクロが用意されています。頻繁に使用されるマクロは、次のとおりです。 T2COLE (LPCTSTR) -> (LPCOLESTR) T2OLE (LPCTSTR) -> (LPOLESTR) OLE2CT (LPCOLESTR) -> (LPCTSTR) OLE2T (LPCOLESTR) -> (LPCSTR)

koi1234
質問者

お礼

回答ありがとうございます ちょっと他の調べものでこちらの作業がなかなかできないのですが 変換マクロがあることはわかりましたのでもう少し時間とれたら ゆっくり確認したいと思うます 簡単にテストしたんですがまた何か勘違いしてるのか マクロ使ってもさらに別のエラーが発生して コンパイルができなくなっただけで解決はしていません

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

>この場合は const OLECHAR * にキャストするしかないのでしょうか? 何でもかんでもキャストすればいいというものではありません。 TCHARの用に_UNICODEの有無により切り替わることがない型が使われているという事なのですから、ケースに応じた対処をするべきです。

koi1234
質問者

お礼

回答ありがとうございました >何でもかんでもキャストすればいいというものではありません。 それは言われる通りだと思いますが >ケースに応じた対処をするべきです。 では今回に対して言えばどういった対処を取るべきだといわれるのでしょうか? キャストしなくていい const OLECHAR * 型のデータを渡せということなのであれば そこで固定文字列などを渡したい場合どういった方法とればいいのか など疑問が満載状態になってしまいます   今回たまたま TCHAR 型の変数を渡してますが   渡したいデータとして標準関数からの戻り値(CStringデータ)だったり   固定の文字列だったり複数のパターンがあります        (いずれも unicode コンパイルでは問題でていません)   ベースコードSDKのサンプルなどから持ってきてそういった状態なのですが   サンプルも文字セット気にしないで記載されているということなのでしょうか? 文字コード変更でこれほど悩むとは思わなかったんで混乱してきてます 他に優先してやらないといけないことがあるので文字コード変更の対応(テスト) がなかなか進みません

関連するQ&A

専門家に質問してみよう