半角カタカナを表示しないには?

解決


ウッディピノ  2007-10-25 22:42:35  No: 66651

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);

}
-----


tetrapod  2007-10-25 23:14:32  No: 66652

A-grave は UNICODE で U+00C0 これを UTF-16 表記すると 0x00C0
いわゆる半角カタカナのタは CP932 表記で 0x00C0
ということで、数値は同じ、表記方法が違う、ということになる

この辺を理解するには文字集合とエンコーディングについて知っておかなきゃならん。

その辺が理解できているとして、プログラム上の誤りだけ指摘するなら
・#define _UNICODE がその位置にあっても無駄
・setlocale で English を指定してよいかどうか?を再検討
・0x00C0 を A-grave として表示する手段の検討
あたりかな。


Bue  2007-10-25 23:41:14  No: 66653

# tetrapod さんからすでに指摘がありますけど、
表示とはどこにでしょうか?
デバッグウィンドウ?コンソールウィンドウ?メッセージボックス?ファイル?

一応メッセージボックスなら

#include <windows.h>

int main()
{
    wchar_t ws[] = L"\u00c0";
    ::MessageBoxW(NULL, ws, L"", MB_OK);

    return 0;
}

で表示できます。


Blue  2007-10-26 00:15:39  No: 66654

# ハンドル間違えてたw orz


tetrapod  2007-10-26 18:49:55  No: 66655

わかりにくいかしら・・・要するに
・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 は「プロジェクトの設定」中にて行う
    たいていの場合、ソースコード中に入れても意味が無い
ということになるわけだ。やって味噌


ウッディピノ  2007-10-27 05:17:56  No: 66656

tetrapodさん Blueさん  回答ありがとうございます。

ご指摘通り実行したら、うまくできました。
ただ…

tetrapodさんの
>・提示コード中の wbsbuf の取り扱いも(今のところ)正しい
の(今のところ)が気になります。

これはきっと、これからうまく作れば問題ないぞ!
って意味で勝手に解釈してます。(^^;

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加