WindowsXP で .net 2003 を勉強しています。
VBA等で 「a」を入力すると「À」と返される関数を作りましたが、
C++では「a」を入力すると半角の「タ」が返ってきます。
何がいけないか(全部いけないのでしょうけど・・・)がわかりません。
----- VBA
dim wbsbuf as string
wbsbuf ="a" '入力されたと仮定
' 判定(省略)
chrW(&hC0)
-----
----- C++
#include <locale.h>
#include <tchar.h>
#define _UNICODE
void foo( TCHAR* wbs)
{
setlocale(LC_ALL, "English");
TCHAR wbsbuf[] = _T("a"); // 入力されたと仮定
// 判定(省略)
wbsbuf[0] = 0x00c0;
_tcscpy( wbs, wbsbuf);
}
-----
A-grave は UNICODE で U+00C0 これを UTF-16 表記すると 0x00C0
いわゆる半角カタカナのタは CP932 表記で 0x00C0
ということで、数値は同じ、表記方法が違う、ということになる
この辺を理解するには文字集合とエンコーディングについて知っておかなきゃならん。
その辺が理解できているとして、プログラム上の誤りだけ指摘するなら
・#define _UNICODE がその位置にあっても無駄
・setlocale で English を指定してよいかどうか?を再検討
・0x00C0 を A-grave として表示する手段の検討
あたりかな。
# tetrapod さんからすでに指摘がありますけど、
表示とはどこにでしょうか?
デバッグウィンドウ?コンソールウィンドウ?メッセージボックス?ファイル?
一応メッセージボックスなら
#include <windows.h>
int main()
{
wchar_t ws[] = L"\u00c0";
::MessageBoxW(NULL, ws, L"", MB_OK);
return 0;
}
で表示できます。
# ハンドル間違えてたw orz
わかりにくいかしら・・・要するに
・A-grave に対して 0xC0 を与えていること自体は正しい
・提示コード中の wbsbuf の取り扱いも(今のところ)正しい
・_UNICODE の指定場所が間違っているので機能してない、
つまり今ユニコードでなくMBCSを使ってしまっている、
したがって 0xC0 という値は タ と解釈され A-grave にはならない
ということで _UNICODE の指定場所を変えれば期待通りに動くはず。
# っていうか _UNICODE と UNICODE で意味が違うんだが・・・
具体的な対処方法は以下の通り。
1.TCHAR と _TCHAR の違いを理解し、どっちを使うかを選択する
2.#define UNICODE で TCHAR がユニコード化される
#define _UNICODE で _TCHAR がユニコード化される
ので、先の TCHAR/_TCHAR の違いから UNICODE/_UNICODE のどっちを使うかを選択
(どちらか片方だけでなく両方使う選択もあり)
3.UNICODE/_UNICODE の #define は「プロジェクトの設定」中にて行う
たいていの場合、ソースコード中に入れても意味が無い
ということになるわけだ。やって味噌
tetrapodさん Blueさん 回答ありがとうございます。
ご指摘通り実行したら、うまくできました。
ただ…
tetrapodさんの
>・提示コード中の wbsbuf の取り扱いも(今のところ)正しい
の(今のところ)が気になります。
これはきっと、これからうまく作れば問題ないぞ!
って意味で勝手に解釈してます。(^^;
ありがとうございました。
ツイート | ![]() |