文字を ascii コード変換

解決


haru  2007-03-15 13:20:40  No: 64668  IP: 192.*.*.*

Visual C++ 2005 Express Edition マネージ形式

半角英数字記号からASCIIコードを取得するにはどうしたら良いでしょうか?
VB6ではAsc() を使い  A ==> 65 が取得出来るのですが、

編集 削除
keichan  2007-03-15 13:33:23  No: 64669  IP: 192.*.*.*

>半角英数字記号からASCIIコードを取得するにはどうしたら良いでしょうか?


その「半角英数字記号」はどこから入力されるものなんですか?
標準入力で「A」とタイプしたら「65」と表示したいってことですか?

編集 削除
Blue  2007-03-15 13:34:11  No: 64670  IP: 192.*.*.*

>半角英数字記号
だけなら別にそのまま取得できるのでは?

System::Char c = L'A';
int n = (int)c;


char c = 'A';
int n = (int)c;


wchar_t c = L'A';
int n = (int)c;


System::String s = "A";
int n = (int)s.ToCharArray()[0]; // int n = (int)s[0]; でもOKなはず

編集 削除
Blue  2007-03-15 13:34:51  No: 64671  IP: 192.*.*.*

訂正

>System::String s = "A";
>int n = (int)s.ToCharArray()[0]; // int n = (int)s[0]; でもOKなはず
System::String^ s = "A";
int n = (int)s->ToCharArray()[0]; // int n = (int)s[0]; でもOKなはず

編集 削除
haru  2007-03-15 14:20:51  No: 64672  IP: 192.*.*.*

Blue  さん、
Web検索している間に数回も書いて頂きましてありがとうございます。
今までも他の事でもWeb検索を何回かしているのですが
自分に理解出来るものが無くて手こずっています。

> その「半角英数字記号」はどこから入力されるものなんですか?

現在はテスト中なので変数に文字をセットしてます。
最終的には文字列(例  ABCD  とか)から一文字ずつ抜き出して
順次ASCIIコードに変換...の積もりでいます。


MSのページの「ランタイム ライブラリ リファレンス」で__toascii  を
見つけたのですがこのページの説明だけでは分からずに
Web検索で見つけたコードを下記の様に修正して A ==> 65 が
取得されている事がわかりました。  (デバッグモード)

char *p;
p = "A";
int as;
as = __toascii(*p); 


今回  Blue  さん  が提示してくれたサンプル4ケを試しました。
1〜3は65が取得されましたが4はゼロでした。
訂正後のコードおよび  「 int n = (int)s[0]; でもOKなはず」の方も。
理由はまだ不勉強のために分かりません。


便乗質問で申し訳ないのですが、もう一つ教えて下さい。

数値をテキストボックスに表示するには型変換をしないとダメの様ですが、
参考書やWebを見ても初歩的なコードに当たりません。

textBox1->Text = n;

編集 削除
Blue  2007-03-15 14:27:24  No: 64673  IP: 192.*.*.*

便乗のほうから

ToStringメソッドを使えばいいです。
もしくはString::Formatとか。

>1〜3は65が取得されましたが4はゼロでした。
0でしたか。
実行環境がないので憶測で答えているところですから間違っているのかも。

ちなみにどんなことをしているのかというと、

System::Stirng s = "ABC";
array<System::Char>^ ca = s->ToCharArray(); // 文字の並びを取得
Char c = ca[0]; // 先頭の要素を取得
int n = (int)c; // キャストは要らないかも

ということをしています。
ただし、これらはすべて
>半角英数字記号
でASCIIコードを取得するという前提にしています。
それ以外のものがあったときASCIIコードが取得できるという保障はないです。
場合によってはエンコードする必要が出てくるでしょう。

編集 削除
Blue  2007-03-15 14:31:22  No: 64674  IP: 192.*.*.*

ついで。

マネージドいっさい関係ないところであれば

char s[] = "ABC";
int n;

n = s[0]; // 65
n = s[1]; // 66
n = s[2]; // 67
n = s[3]; // 0(終端文字)

と簡単に取得できます。

編集 削除
haru  2007-03-15 14:32:56  No: 64675  IP: 192.*.*.*

Blue  さん、ありがとうございます。

ToStringメソッド  および  String::Format  を調べて
テストして見ます。

編集 削除
haru  2007-03-15 14:51:09  No: 64676  IP: 192.*.*.*

Blue  さん、ありがとうございます。
提示していただいた、どちらも上手く行きました。

textBox1->Text = n.ToString();             // OK

textBox1->Text = String::Format("{0}",n);  // OK

編集 削除
Blue  2007-03-15 15:23:42  No: 64677  IP: 192.*.*.*

>場合によってはエンコードする必要が出てくるでしょう。
参考

int main(array<System::String^>^ args)
{
    System::String^ s = "ABCあいうえお";

    for each (System::Char c in s)
        System::Console::WriteLine("{0:x}", (int)c);

    System::Console::WriteLine("----");

    for each (System::Byte b in System::Text::Encoding::ASCII::GetBytes(s))
        System::Console::WriteLine("{0:x}", b);

    System::Console::WriteLine("----");

    for each (System::Byte b in System::Text::Encoding::GetEncoding(932)::GetBytes(s)) // Shift_JIS
        System::Console::WriteLine("{0:x}", b);
}

編集 削除
haru  2007-03-15 15:30:08  No: 64678  IP: 192.*.*.*

Blue  さん、ありがとうございました。

編集 削除