char型の配列を使って、ファイル入出力するプログラムを作成しています。文字列の切り離し処理が必要なことから、unicodeの設定にして、配列を2バイトに統一したいと思っています。この場合、どういうようにコードを書き換えたら良いのでしょうか?


開発環境.NET2003VC++ Windows2000
CやAPI等だけを使って実現したいと思っています。
よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/06/26 15:35:04
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:kazu1107 No.1

回答回数199ベストアンサー獲得回数14

ポイント35pt

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宣言により変わる

id:champclair

コメントありがとうございます。

CHARからWCHAR型に変えてやってみていますが、

コンパイルが通りません。

kazuさんの回答を参考にして、

もう少し調べてみますね。

2006/06/19 16:19:39
id:ohmix1 No.2

回答回数235ベストアンサー獲得回数14

ポイント35pt

>文字列の切り離し処理が必要なことから、

>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へ移植しにくくなるります。


以上

id:ma-kanoh No.3

回答回数155ベストアンサー獲得回数4

ポイント10pt

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

も一応、挙げておきます。

>。この場合、どういうようにコードを書き換えたら良い

は、まず「マルチバイト」か「ワイド文字」かどちらか決定して

からです。使う関数が体系で分かれてますので。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません