開発環境.NET2003VC++ Windows2000
CやAPI等だけを使って実現したいと思っています。
よろしくお願いします。
WinAPIの文字コードはどちらを使うか悩むところが結構あったりしますが、プログラムの処理に直結するような部分の文字コードは、char(CHAR)型やwchar_t(WCHAR)型を使い、そうでもない(たとえばメッセージボックスに渡す文字列型など)はTCHARやLPTSTR,PTCHARなどを使うようにすれば良いと思います。
CHARやWCHARは前者から1バイトと2バイトと固定ですが、TCHARなどは「#define UNICODE」が宣言されていれば2バイト。違えば1バイトになります。
それとAPI関数に文字列を渡す場合はMessageBoxの実体は、ShiftJIS用がMessageBoxA()。Unicode用がMessageBoxW()です。
文字列を扱う関数の全てがこのような仕様ですが、MessageBoxWは9x系には標準装備されてなかったはずですので注意が必要です。
文字列定数に関しては以下のような感じになります。
wsprintfA(buf, "test"); // シングルバイト
wsprintfW(buf, __T("test")); // ダブルバイト
wsprintf(buf, TEXT("test"); // UNICODE宣言により変わる
>文字列の切り離し処理が必要なことから、
>unicodeの設定にして
↑この関係がわかりませんが、とりあえず分かることを書きます。
まず、マニュアルはこのあたりです。
http://msdn2.microsoft.com/ja-jp/library/5z097dxa.aspx
簡単に書くと、MBCSでは
char c = 'c';
const char* szMsg = "message";
printf("CHAR=%c MSG=%s\n", c, szMsg);
と書いているのをUNICODEでは
wchar_t c = L'c';
const wchar_t* szMsg = L"message";
wprintf(L"MSG=%s\n", szMsg);
と書きます。これだとMBCSとUNICODEを明確に意識してプログラムしないといけないので、
VC++ではどちらでもコンパイルできるように、
TCHAR c = TCHAR('c');
LPCTSTR szMsg = _T("message");
_tprintf(_T("MSG=%s\n"), szMsg);
と書くことができます。
つまり、WindowsAPI、Cランタイム関数、char型には
・MBCS版
・UNICODE版
・どちらでもコンパイルできるラッパー定義
が存在します。通常はどちらでもコンパイルできるように書いておくのが無難ですが、完全に正しく動くかどうかは微妙です。
なお、
・Windows9xではUNICODE系のAPIはありません。
・そのように書いてしまうとUnixへ移植しにくくなるります。
以上
http://ja.wikipedia.org/wiki/マルチバイト文字
まず、WindowsのAPI、Win32APIを使用する場合は
・マルチバイト(Unicode文字集合==常に2バイト。utf16と同じ意味)
・ワイド文字(utf8文字集合==1~4バイト可変)
のどちらを使うか決めなければいけません。
で、マルチバイトを使うならば、ぜーんぶ2バイトです。
ASCII文字に見えても、そのように見てはいけません。
、、んん、でもないか。ASCIIだと分かりきっていればそれでも
いいです。
混ぜるな危険ってやつですが。
>char型の配列
とありますが、マルチバイト文字は、あくまで「マルチバイト」
の「文字型」とと考えたほうが身のためです。
一応、「MBCS」となってますがあまり信頼しすぎると、
変な動作をしだします。
http://msdn2.microsoft.com/ja-jp/library/zz3x65c7.aspx
も一応、挙げておきます。
>。この場合、どういうようにコードを書き換えたら良い
は、まず「マルチバイト」か「ワイド文字」かどちらか決定して
からです。使う関数が体系で分かれてますので。
コメントありがとうございます。
CHARからWCHAR型に変えてやってみていますが、
コンパイルが通りません。
kazuさんの回答を参考にして、
もう少し調べてみますね。