Console.ReadKeyを使用したUnicodeの読み取り
-
11-07-2019 - |
質問
コンソールアプリにUnicode入力を提供し、Console.ReadKey()を介してUnicode文字/文字列を読み取ることは可能ですか?
他の方法で入力を読み取るときにUnicodeが機能することは知っていますが、残念ながらReadKeyが提供する「インターセプト」機能を使用する必要があります。
更新:
コンソールにU + 03BB(λ)などのUnicode文字を貼り付けると、3つのキーが読み取られます。
- Alt + NumPad1
- Alt + NumPad1
- 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文字列にすることができます。