2016-05-05 12 views
0

altコードのテーブルを作成するスクリプトを作成しようとしています。 たとえば、Windowsでは、キーコンボのALT + 227が文字πを印刷し、ALT + 7899が█を印刷します。C#マッピングALT + <XXX>文字のコード

私はC#でそのデータにアクセスするさまざまな方法を試しましたが、すべてのメソッドが異なる値を思いついているようです。 227をキャラクタにキャストしてもπが生成されず、System.Textのエンコードオプションも使用されません。

altコードを文字に正しくマップするにはどうすればよいですか?

答えて

2

このAlt-XXXのものはすべて、Unicode前の日から残っています。 MS-DOSの時代には、文字コードは8ビットで、この組み合わせは文字番号XXXを入力しました。米国、カナダ、西ヨーロッパのPCユーザーは、IBM PCの元の文字セットを使用しました。コードページ437以降でした。 )。テキストモード画面では、擬似コードポイントを持つ必要がありました。

Windowsが設計されたとき、マイクロソフトは独自のコードページセットを導入し、文字の位置をより一貫して導入することに決めました。また、Windowsはグラフィックモードで実行されていたため、擬似コードポイントが不要になり、文字グリフを追加する余地が残りました。しかし、当時、文字は主に8ビット(メモリは貴重だったため)であり、Unicodeは将来の明るい見通しであり、UTF-8などの強力なエンコード方法は存在しませんでした。だから、いろいろな国でもまだ異なるコードページが必要でした。 WindowsはMS-DOSに大きく依存し、MS-DOSプログラムを実行することができました。また、多くのユーザーがAlt + XXXトリックに慣れていました。したがって、Windows構成には、MS-DOSアプリケーション(および後でWindowsコンソールアプリケーション)用のいわゆるOEM(オリジナル装置製造元)コードページと、Windowsアプリケーション用のANSIコードページという2つのコードページが含まれていますそれらをANSIによって標準化すること)。たとえば、米国のコンピュータは、通常、OEMコードページ437とANSIコードページ1252に構成されます。ロシアのコンピュータをOEM 866とANSI 1251に変更しました。コードページに関するユーザーの思い込みをなくすために、WindowsはWindowsアプリケーションのAlt + XXXキーストロークを扱う際にOEMからANSIに自動的に再マッピングしました。さらに、新しいANSI文字を利用したい人にAlt + 0XXXが導入されました。

あなたは、それでもまだ保持しているすべてを見つけることに驚くかもしれません!現在はUnicode、UTF-8などの優れた機能を備えていますが、8ビット文字コード、コンソール用OEM、グラフィックモード用ANSIなどのアプリケーションとの互換性のために、2つのコードページという概念があります。コードページ437をチェックすると、位置227にπが含まれていることがわかります。コードページ437がOEMコードページとして構成されている場合は、Alt + 227がπになります。コンピュータがOEMコードページ866に設定されているため、Alt + 227がу(キリル文字)に入ります。

なぜAlt + 7899は█に入るのですか?オリジナルのIBM PCキーボード割り込みハンドラは数値のオーバーフローを処理しなかったので、Alt + 7899を入力すると正直に(char)(((7 * 10 + 8) * 10 + 9) * 10 + 9)(NB:charは8ビットでした)が計算され、219となりました。コードページ437のコードポイント219は█です。このオーバーフローロジックは、現代のWindowsシステムでは引き続き維持されています。

このストーリーは、1バイトに収まらない極東言語ではすべてが間違っている可能性があるため、不完全です。

あなたの質問に対する答えは何ですか?システムのOEMコードページのcodepoint XXXをUnicodeにマップする必要があります。 System.Text.Encoding.GetEncoding(System.Globalization.CultureInfo.CurrentCulture.TextInfo.OEMCodePage)(コンソールアプリケーションでもSystem.Console.OutputEncoding)は、コンピューターのOEMコードページのクラスSystem.Text.Encodingのインスタンスを返します。次に、GetCharsメソッドは、OEMコードポイントをUnicodeコードポイントに変換します。

関連する問題