人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: champclair
●カテゴリ:コンピュータ 学習・教育
✍キーワード:.NET API Char Unicode VC++
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kazu1107
●35ポイント

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

◎質問者からの返答

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

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

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

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

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


2 ● ohmix1
●35ポイント

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

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


以上


3 ● ma-kanoh
●10ポイント

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ