質問

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

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

更新:

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

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

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

役に立ちましたか?

解決 3

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

現在、Win7 64ビットで同じテストを行ったところ、血なまぐさいことは機能します!

したがって、Vistaまたは32ビットのバグ。

誰かがこれを確認してもらえますか?

他のヒント

残念ながら、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に変換します-もちろん、これは貼り付けを許可しません。

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

char c = Console.ReadKey().KeyChar;

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top