- ベストアンサー
VC++ マルチバイト文字とUniCode文字??
VC++のプロジェクトプロパティには文字セット指定があります 『マルチバイト文字セット』『UniCode文字セット』の2者が選択出来ますが、これらの選択の優劣は何処にありますか? この選択の適否が分からない私は参考にしているサンプルがマルチバイトである時にはマルチバイトを、またUniCodeで書かれたサンプルを見ている際にはUniCodeを指定しており、恥ずかしいかぎりです 選択の判断基準を如何すれば良いのかご指導をお願い申し上げます 更に恥ずかしい質問】なぜC#には文字セット指定が見当たらないのでしようか???
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
WindowsAPIの中で、文字列をパラメータにするものは マルチバイト用、UniCode用で関数名が異なります。 例えばファイルを開くCreateFileでは第1パラメータが ファイルのパス名なのですが、マルチバイト用では CreateFileA、UniCode用はCreateFileWとなります。 ヘッダファイルの中では単にCreateFileとした時に、 どちらの関数を割り当てるかが文字セットにより決定 されるようになっています。 尚、一部のAPIではUniCodeでしか動かないものも あります。 「優劣」という観点ではどちらが良いかとは言えません。 「仕様による」としか言えません。あるシステムからの 出力ファイルを受けて処理する場合はそのシステムの コードに合わせるのが普通でしょう。 また、Office等で使用するVBA用のDLLを開発する場合、 文字列はマルチバイトで受け渡しされますので、マルチ バイト文字をベースにするのが一般的です。 勿論、内部事情を知っていれば文字列で渡さないで、 文字列の内部アドレス(StrPtrで求まる)を長整数として 渡すことで、UniCodeベースで開発することもできますが、 見た目は何をやっているのか分かり難くなります。 C#は内部コードがUniCodeに決まっています。
その他の回答 (1)
- Yune-Kichi
- ベストアンサー率74% (465/626)
正確な説明ではないですが, マルチバイト文字セットというのは,実行時の文字コードとしてシフトJISを使う,ということです。 Unicode文字セットというのは,実行時の文字コードとしてUTF-16を使う,ということです。 # 文字集合はどちらも現行のWindowsではUnicodeなので……。 過去の互換,つまりはWindows 95/98/Me相手にする場合を除き, 個人的には全部Unicode文字セットでいいじゃない,とは思いますが……。 # そもそもWin95系列は現行のVC++のランタイム自体がサポートを打ち切っていて,実行できない可能性があります。 マルチバイト文字セットではファイルが開けないとか (U+00A5 ¥とか→U+005C \に変換される,シフトJISに対応文字がない等), ウィンドウに文字を表示しようとしたら文字化けするとか,文字関係の問題がいろいろ出てくる可能性があります。 # 外部とのI/Oで文字コード変換の話は出てくるものの,それは文字セットの問題ではないので割愛。 なお,Windows NT時代から,32/64-bit Windowsの内部はUnicode化されています (Windows 95/98/Me除く)。 マルチバイト文字セットのAPIの利用は,内部で文字コード変換を行ってUnicode文字セットとして処理されます。 C#に指定箇所がないのは,C#の内部の文字集合はUnicode,文字コードはUTF-16固定だからです。 それ以外の文字コードを取り扱う場合は, ・Stringなどの利用を諦めByteの配列を自分で操作する ・一度EncodingでUTF-16に変換してStringとして処理して,必要な場合に再度文字コードの変換を行う といった処理になります。 # 通常は後者。
お礼
ありがとうございました 『個人的には全部Unicode文字セットでいいじゃない,とは思いますが…』 ← 私もそのように感じてはおりましたが、その根拠が分からず迷っておりました 今回のご回答で良く理解出来ましたのでUniCodeでいこうと決心いたしました ありがとうございます
お礼
ご指導ありがとうございます 『Office等で使用するVBA用のDLLを開発する場合、文字列はマルチバイトで受け渡しされますので、マルチバイト文字をベースにするのが一般的です』 ← 私がC++を使用する目的はDLLの作成ですからマルチバイトも捨てがたく益々迷ってしまいます どうしようかと困ってしまいました でもご指導で問題点がはっきりいたしましたので、取り敢えず以下のように致します (1)DLLはマルチバイト (2)その他はUniCode ← 実際のところ、これはあまり作りません(C#でやっております) また困ったら相談致しますので宜しくお願い致します ありがとうございました