2

コンソール アプリに Unicode 入力を提供し、Console.ReadKey() を介して Unicode 文字/文字列を読み取ることは可能ですか?

他の方法で入力を読み取るときに Unicode が機能することは知っていますが、残念ながら ReadKey が提供する「インターセプト」機能を使用する必要があります。

アップデート:

U+03BB (λ) などの Unicode 文字をコンソールに貼り付けると、3 つのキーが読み取られます。

  1. Alt + NumPad1
  2. Alt + NumPad1
  3. Alt + NumPad8

これが何らかのエンコーディングであるかどうかを確認しようとしましたが、何も表示されません。

4

3 に答える 3

5

残念ながら、Console.ReadKey はキーボード イベントしか処理できません。キーボード イベントは、(ConsoleKey 列挙で定義された実際のキーと「仮想」キーを使用して) キーボードで入力できるもののみを表すことができます。そのため、ReadKey を使用すると、キーボードのキーに対応する生のキー コードと、コンソールの入力コード ページで生のキー コードがマップされる Unicode 文字である変換された文字 (および各コード ページは最大 256 文字をマップできます)。ReadKey を使用して、他のタイプのデータ (つまり、直接入力できない文字や入力コード ページにマッピングされていない文字) を読み取ることはできません。

さらに、コンソールに Unicode 文字を貼り付けると、ReadKey によって使用される API が文字を Windows の ALT+nnn シーケンスに変換しようとします (つまり、ALT を押しながらキーパッドでコード ポイント番号を入力します)。残念ながら、最初に入力コード ページに定義されたルールを使用して文字を変換するため、コード ポイント番号を再構成しても、貼り付けられた実際の文字は取得されず、コード ページがマップする文字は取得されます。に。

Read または ReadLine を使用するとすべてが機能する理由は、これらがキーボード ベースではなくストリーム ベースのメソッドだからです。キーボードとコード ページの変換が行われないため、入力ストリームを介して任意の文字を入力できることは明らかです。ただし、ReadKey を使用して入力ストリームを直接取得することはできず、キーボードのみを使用します (入力ストリームがキーボード以外の場所からリダイレクトされた場合、ReadKey は完全に失敗します)。

P/Invoke でコンソール API を手動で使用する場合、入力ストリームを使用して ReadKey の「インターセプト」機能を複製する方法があるかもしれませんが、それは自明ではなく、コンソールは実際にはそのようなことを行うように設計されていません。だからあなたはおそらくずっとそれと戦っていたでしょう。


編集: とはいえ、独自のキーの組み合わせを実装して、キーボードから Unicode 文字を入力できるようにすることもできます。たとえば、CTRL + ALT + U を入力してから 4 つの 16 進数を入力するなどです。ReadKey ルーチンは CTRL + ALT を検出できます。 +U を押して、次の 4 つのキーストロークを取得し、それらから int を作成して char に変換しますが、もちろんこれでは貼り付けはできません。

于 2008-11-30T17:56:32.610 に答える
0

Console.ReadKey()によって返されるConsoleKeyInfoオブジェクトには、押されたキーまたはキーの組み合わせのUnicode文字を含むKeyCharというプロパティがあります(キーまたはキーの組み合わせに同等のUnicodeがある場合)。それで...

char c = Console.ReadKey().KeyChar;

キーに同等のUnicodeがない場合(たとえば、ファンクションキー)、「\0」文字を取得します。

必要に応じて、StringBuilderを使用して、これらの文字をUnicode文字列に連結できます。

于 2008-11-28T17:14:03.087 に答える
0

今、これはただ奇妙です。IIRC 私のテストは 32 ビット、おそらく Vista で行われました。

Win7 64 ビットで同じことをテストしたところ、うまくいきました。

つまり、Vista または 32 ビットのバグです。

誰かがこれを確認できますか?

于 2011-08-04T11:53:41.467 に答える